Я работаю в JavaScript, но проблема общая. Возьмите эту ошибку округления:
>> 0.1 * 0.2
0.020000000000000004
Этот ответ StackOverflow дает хорошее объяснение. По сути, некоторые десятичные числа не могут быть точно представлены в двоичном виде. Это интуитивно понятно, так как 1/3 имеет аналогичную проблему с основанием 10. Теперь обходной путь таков:
>> (0.1 * (1000*0.2)) / 1000
0.02
Мой вопрос: как это работает?
0.1 * 200 / 1000
или20 / 1000
, что, конечно, не имеет проблемы с плавающей запятой. - person adeneo   schedule 12.06.20140.1 * 200 == 20
нетривиально и фундаментальным образом зависит от двоичного расширения0.1
. Сравните, например, с0.145 * 200 < 29
. Это не заслуживает того, чтобы заметать под ковер одним лишь словом «или». - person tmyklebu   schedule 12.06.20140.145 * 200
со схемой, которую вы, кажется, предлагаете. Возможно, вам стоит еще раз взглянуть на WECSSKAFPA. . - person tmyklebu   schedule 12.06.2014