|
|
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Слышал что-то нехорошее про статист. Sum, но что уже не помню, Просветите меня почему она складывает числа типа: Double и Single добавляя им длинные хвосты после запятой. Можно конечно округлять обратно после такого суммирования, НО: 1. интересно почему она так делает? 2. как там с точностью, если например надо точняк просуммировать до сотых - округление Round(Sum([Поле1]);2) не будет хронически ошибаться...? ну и как лучше в итоге сделать, если надо точно просуммировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 16:29 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Cовсем недавно был топик про неправильное округление у сингла. Попробуй поиском. Из него видно, что лучше пользоваться только double. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 16:35 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Поиском уже все перелопатил, ничего интересного не нашел... поищем еще но помойму с Double такая же фигня, ща проверю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 16:38 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Мдаа, нашел переписку за 17 мая 03 про округление, гружусь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 16:54 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Вообщем, вот что там было по существу: Q1: Почему ошибочно считаются большие числа типа Currency в SQL? Q2: Почему SELECT SUM (Single) выдает 27.2900012135506 вместо 27.29? Q3: Почему Int & Fix для некоторых чисел неверно производят усечение? Q4: Почему у меня получается 418.4 - 408.8 равным 9.59999999999997? A: Все эти ошибки связаны с неверной (или вообще не проводимой) нормализацией чисел и преобразования типов в 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 с таким багом), число меньшей значащей разрядности можно (и нужно) представить как число не меньшей значащей разрядности без потери точности. Интеpесно, что пpедставление целого числа как Double не вызывает потеpи точности ни в VBA ни в SQL, сбой пpоисходит только для выpажений, пpичем даже для типа: (Val+0) (!!). Обработка чисел с плавающей точкой по идее (из институтского курса:) должна заканчиваться округлением до пределов точности вычислений (с учетом того, что операции с плавающей точкой выполняются в расширенном формате). Увы, эта операция не производится (почему?). Отсюда 4/2=1.99...97 - невесело однако, вернее, жопа это Делаю пока так: Round(Sum([Поле1]);2) тип поля Поле1-Double и тогда конечный результат соответствует действительному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 17:44 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Double для здоровенных целых чисел (более 15 разрядов) тоже барахлит. Вот пример: ?cdec(2^49) 562949953421312 ?cdec(562949953421312 * 2) 1125899906842620 ?cdec(562949953421312) * 2 1125899906842624 Jet3.0 - это было давно. Jet3.5 и Jet4.0 Currency считают правильно, а в последнем есть еще и Decimal. Для точности вычислений желательно и храненить числа в поляхь указанных типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2003, 19:07 |
|
||
|
Как работает Sum с Double и Single
|
|||
|---|---|---|---|
|
#18+
Так я это и имел ввиду (а также автор, которого я цитировал), что хранит Access Double нормально, а как любую матем. операцию сделает над этими числами получает число с БОЛЬШИМ периодом и без округления обратно нормальный вид не получишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2003, 11:39 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1747&tid=1679304]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 376ms |

| 0 / 0 |
