SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » Округление (Странности Delphi 11)
icon10.gif  Округление [сообщение #4852] Mon, 08 April 2024 18:18 Переход к следующему сообщению
sf в настоящее время не в онлайне  sf
Сообщений: 11
Зарегистрирован: July 2023
Junior Member
Народ, есть вот такой код с почти похожими исходными данными для округления:

Writeln(SimpleRoundTo(0.09435, -4));
Writeln(SimpleRoundTo(0.19435, -4));
Writeln(SimpleRoundTo(0.29435, -4));
Writeln(SimpleRoundTo(0.39435, -4));
Writeln(SimpleRoundTo(0.49435, -4));
Writeln(SimpleRoundTo(0.59435, -4));
Writeln(SimpleRoundTo(0.69435, -4));
Writeln(SimpleRoundTo(0.79435, -4));
Writeln(SimpleRoundTo(0.89435, -4));
Writeln(SimpleRoundTo(0.99435, -4));
Спорим, не угадаете, что будет на выходе? Я, например, до сих пор под впечатлением. Вот такой результат ():

9.44000000000000E-0002
1.94300000000000E-0001
2.94300000000000E-0001

3.94400000000000E-0001
4.94400000000000E-0001
5.94400000000000E-0001
6.94400000000000E-0001
7.94400000000000E-0001
8.94400000000000E-0001
9.94400000000000E-0001   

Это, сцука, какое-то новое слово в математике!
А мы тут с народом третий день бъемся, переводим проект на Лазаря и математика не совпадает. Теперь понятно почему. У Лазаря всё как положено:

9.43999999999999999973E-0002
1.94400000000000000005E-0001
2.94400000000000000014E-0001
3.94400000000000000008E-0001
4.94400000000000000003E-0001
5.94400000000000000024E-0001
6.94399999999999999992E-0001
7.94400000000000000014E-0001
8.94399999999999999981E-0001
9.94400000000000000003E-0001

Как дальше жить?
Re: Округление [сообщение #4855 является ответом на сообщение #4852] Tue, 09 April 2024 00:34 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Открыть для себя http://docwiki.embarcadero.com/RADStudio/Alexandria/en/Float ing-Point_Number_Control_Routines
Или почитать таки http://docwiki.embarcadero.com/Libraries/Alexandria/en/Syste m.Math.SimpleRoundTo
Цитата:
Note: The result of this function depends on the current FPU rounding mode. You can change the FPU rounding mode using the SetRoundMode function.

[Обновления: Tue, 09 April 2024 00:37]

Известить модератора

Re: Округление [сообщение #4901 является ответом на сообщение #4855] Sat, 13 April 2024 16:34 Переход к предыдущему сообщениюПереход к следующему сообщению
sf в настоящее время не в онлайне  sf
Сообщений: 11
Зарегистрирован: July 2023
Junior Member
Давно открыто. Не нужно считать себя умнее других.
Речь про выделенное красным. Как себя ведут числа с плавающей запятой давно известно и понятно. В Лазаре результат честный, 9-ка в периоде, условно, а в Delphi нули в остальных разрядах.
Re: Округление [сообщение #4902 является ответом на сообщение #4901] Sun, 14 April 2024 00:29 Переход к предыдущему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
И? Ещё с первой версии Дельфи отбрасывает младший бит при сравнении и выводе плавающих чисел. Собственно, это поведение было ещё в Турбо Паскале. Это изначально учебный язык, поэтому он сделан так, чтобы не пугать школьников тем, что 0,1+0,1<>0,2.
Предыдущая тема: не визуализируется прога запущенная в автозагрузке
Следующая тема: F2046 Out of memory
Переход к форуму:
  


Текущее время: Sun Nov 24 02:37:03 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00570 секунд