185,3 + 12,37 = 197,67000000000002?

Возможный дубликат:
Понимание проблем с плавающей запятой

На этой странице есть простое оповещение:

alert(185.3 + 12.37);

Для меня это должно быть равно 197,67.

Однако в браузерах, которые я тестировал (Chrome/Safari на OSX, FF на Win7), ответ таков:

197.67000000000002

Это почему? Это просто известная ошибка или есть нечто большее, чем добавление JavaScript, чем я понимаю?


person DA.    schedule 11.04.2011    source источник
comment
Добро пожаловать в мир поплавков. См., например, Понимание проблем с плавающей запятой.   -  person deceze♦    schedule 11.04.2011
comment
Эй, его плавающая точка никогда не бывает точной.   -  person Richard Schneider    schedule 11.04.2011
comment
Ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо...   -  person Ignacio Vazquez-Abrams    schedule 11.04.2011
comment
Это числа, которые не имеют точного двоичного представления, поэтому нет ничего необычного в том, чтобы получить некоторый шум в младших битах.   -  person Mike Dunlavey    schedule 11.04.2011
comment
@Майк...ах! Спасибо за это. Так что это проблема преобразования нашей математики base10 в двоичную.   -  person DA.    schedule 11.04.2011
comment
@Richard: На самом деле, я считаю, что плавающая запятая точна, если вы придерживаетесь целых чисел или кратных 2 ^ n, где n может быть положительным или отрицательным (т. Е. 1,75 = 7 * 2 ^ -2).   -  person Mike Dunlavey    schedule 11.04.2011
comment
Да, вы правы, Майк, в данном случае речь идет о математическом определении конечных мест. 1,75 будет 2^0 + 2^-1 + 2^-2.   -  person Femaref    schedule 11.04.2011
comment
Я на самом деле удивлен количеством людей, которые удивлены, увидев это.   -  person Esteban Araya    schedule 11.04.2011


Ответы (3)


javascript использует тип данных double, который не может из-за ограниченного количества двоичных разрядов точно выражать все десятичные числа (не все числа могут быть выражены конечными двоичными разрядами). Вы можете прочитать больше в википедии.

person Femaref    schedule 11.04.2011
comment
Ну, похоже, этот вопрос уже задавался. ;О) Спасибо за ответ! - person DA.; 11.04.2011

Вы должны прочитать это:

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

Это не ошибка; это просто общеизвестный факт о числах с плавающей запятой для каждого языка.

person duffymo    schedule 11.04.2011

В двоичном формате это бесконечно повторяющаяся двоичная дробь 11000101.10(10101110000101000111), которая не может быть представлена ​​конечным числом битов, поэтому она округляется до аппроксимации.

person Random832    schedule 11.04.2011