Разбор основных причин некоректной обработки чисел в SQL ...
Почему ошибочно считаются большие числа типа Currency в SQL? Почему SELECT SUM (Single) выдает 27.2900012135506 вместо 27.29 ? Почему Int & Fix для некоторых чисел неверно производят усечение? Почему у меня получается 418.4 - 408.8 равным 9.59999999999997? ----------------------------------------------------------- Все эти ошибки связаны с неверной (или вообще не проводимой) нормализацией чисел и преобразования типов в VB [A] и SQL. Следует учесть, что с Jet3.0 SQL реально использует лишь типы Long, Double и String. Byte,Boolean, Integer правильно преобразуются в Long. Date, Single, Currency преобразуются в Double. Последнее преобразование - грубейшее нарушение стандарта, так как Currency перестает быть целочисленным типом, используемым в бухгалтерии для точных расчетов (целочисленный {с фиксир.точкой} тип не обязательно целое). При этом возникают потери точности при больших числах. В ранних версиях Currency работает верно. Преобразование целочисленных значений (или Single) в Double (и, что важнее, обратно) делается криво (и в VB[A] и в SQL), хотя, в отличие от заблуждения (связанного с большОй распространенностью продуктов MS с таким багом), число меньшей значащей разрядности можно (и нужно) представить как число не меньшей значащей разрядности без потери точности. Обработка чисел с плав.точкой по идее (из институтского курса:) должна заканчиваться округлением до пределов точности вычислений (с учетом того, что операции с плав.точкой выполняются в расширенном формате). Увы, эта операция не производится (почему?). Отсюда 4/2=3.99...97 Рекомендации: - где только возможно используйте целочисленные типы; - вместо Int и Fix используйте для округления Format(vVal, "#."), а для усечения - Format(vVal - SGN(vVal) * 0.5, "#."); - хотя бы не используйте Int/Fix внутри выражений и выражения внутри них; - явным образом следите за преобразованиями типов и корректируйте их; - учтите, что Currency (Jet3.0+) имеет из 19 цифр только 16 значащих. - если при работе с плав.точкой достаточно точности Single, то проще считать числа как Double (впpочем, в SQL/MSA97 они и так будут Double), а pезультат пpиводить к Single, используя функцию CSng. Просмотров: 5346
 Ваш коментарий будет первым | | |