Работя в 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