Вопрос по javascript – Странное поведение Javascript: дополнение с плавающей запятой, дающее неправильный ответ [дубликат]

7

Possible Duplicate:
Is JavaScript’s math broken?

Это кажется действительно глупым, но при запуске это будет отображать

7,300000000000001 вместо 7,3

<script language="javascript">
    function buttonClicked() {
        var mySum = 1.1 + 1.1 + 1.1 + 0 + 4;
        alert(mySum);
    }
</script>

Что вызвало бы это? У меня есть JavaScript на довольно простой странице ASPX. На самом деле мы используем javascript для добавления значений из входных данных формы, это был просто пример с числами, которые его ломали, есть много других ..

Любая идея, что может делать это?!?

Крис, тебе не плохо - я думаю, что кто-то спрашивает об этом каждый день или около того. :-) Nosredna

Ваш Ответ

3   ответа
1

http://docs.sun.com/source/806-3568/ncg_goldberg.html

Что каждый должен знать о числах с плавающей запятой.

4

той сохраняется как сумма долей. Они вычисляются путем добавления ряда дробей. Порядок фракций:

1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, ... etc

Двоичное представление хранится в виде 0 и 1, которые указывают да / нет. Например, 001010 будет 0 * 1/2 + 0 * 1/4 + 1 * 1/8 + 0 * 1/16 + 1 * 1/32.

Это грубый пример того, почему плавающие точки не могут быть точными. При добавлении точности (float -> gt; double -> long double) вы получаете больше точности до предела.

Сохраняемые базовые двоичные данные разбиты на две части - одна для части, которая стоит перед десятичной запятой, а другая для части после десятичной. ЭтоСтандарт IEEE это было принято из-за скорости, с которой можно выполнять вычисления (и, возможно, других факторов сверху).

Проверьте эту ссылку для получения дополнительной информации: http://docs.sun.com/source/806-3568/ncg_goldberg.html

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

как десятичные значения преобразуются в двоичные числа с плавающей запятой. 1/10 превращается в повторяющуюся десятичную в двоичном виде, поэтому число отображается не совсем точно, и повторные операции могут выявить ошибку.

JavaScript использует для записи числа с плавающей точкой IEEE-754. Некоторые другие языки имеют такую же проблему.

Как с этим бороться? В вашем случае, может бытьtoPrecision ().

Error: User Rate Limit ExceededtoFixed()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы