Почитал ещё курс BC402, порадовала фраза...
Внимание: Для вычислений в арифметике с плавающей запятой используются операции с плавающей запятой соответствующих процессоров. Поскольку алгоритмы выполняются над двоичными числами, могут возникать погрешности. Степень и эффект таких погрешностей не поддаются оценке.
Теперь, на примере...
DATA:
l_value1 TYPE p DECIMALS 5 value '1.755',
l_value2 TYPE f value '1.755',
l_result1 TYPE p DECIMALS 1,
l_result2 TYPE p DECIMALS 2,
l_result3 TYPE p DECIMALS 3,
l_result4 TYPE p DECIMALS 4.
l_result1 = l_value1. write / l_result1.
l_result2 = l_value1. write / l_result2.
l_result3 = l_value1. write / l_result3.
l_result4 = l_value1. write / l_result4.
l_result1 = l_value2. write / l_result1.
l_result2 = l_value2. write / l_result2.
l_result3 = l_value2. write / l_result3.
l_result4 = l_value2. write / l_result4.
Результат:
[b]l_value1 TYPE p DECIMALS 5 value '1.755'[/b]Получается, что при float округление, делается с учетом размерности приемника + 1.
0.0 1.8
0.00 1.76
0.000 1.755
0.0000 1.7550
[b]l_value2 TYPE f value '1.755'[/b]
0.0 1.8
0.00 1.75
0.000 1.755
0.0000 1.7550
Т.е. 1,755 которая во представляется внутри как 0.7549999999999999E+00 при преобразовании к 0.00 преобразуют по факту 1.754, а не 1.755
Срочно выкидываем float отовсюду во избежании...
Комментариев нет:
Отправить комментарий