1.265 * 10000 = 126499.99999999999? [дубликат]

< ScrollView ref = {(ref) => {this.scrollListReftop = ref; }}>

< / ScrollView>

// написать это, чтобы прокрутить сверху

this.scrollListReftop.scrollTo ({x: 0, y: 0, animated: true})

6
задан Manishearth 31 January 2014 в 09:56
поделиться

11 ответов

Числа с плавающей запятой не могут правильно обрабатывать десятичные дроби во всех случаях. Посмотрите

24
ответ дан 8 December 2019 в 02:04
поделиться

Это результат ошибки представления с плавающей запятой. Не все числа, которые имеют конечное десятичное представление, имеют конечное двоичное представление с плавающей запятой.

5
ответ дан 8 December 2019 в 02:04
поделиться

Прочтите эту статью . По сути, компьютеры и числа с плавающей запятой несовместимы друг с другом!

4
ответ дан 8 December 2019 в 02:04
поделиться

С другой стороны, 126500 равно 126499.99999999 ....:)

Так же, как 1 равно 0,99999999 ....

Потому что 1 = 3 * 1/3 = 3 * 0,333333 ... = 0,99999999 ....

4
ответ дан 8 December 2019 в 02:04
поделиться

Чисто из-за неточностей представления с плавающей запятой .

Вы можете попробовать использовать Math.round :

var x = Math.round(1.265 * 10000);
2
ответ дан 8 December 2019 в 02:04
поделиться

Вы можете прочитать это .

1
ответ дан 8 December 2019 в 02:04
поделиться

Эти небольшие ошибки обычно вызваны точностью чисел с плавающей запятой, используемых в языке. См. эту страницу в википедии для получения дополнительной информации о проблемах точности с плавающей запятой.

1
ответ дан 8 December 2019 в 02:04
поделиться

Вот способ решить вашу проблему, хотя, возможно, не очень красивый:

var correct = parseFloat((1.265*10000).toFixed(3));

// Here's a breakdown of the line of code:
var result = (1.265*10000);
var rounded = result.toFixed(3); // Gives a string representation with three decimals
var correct = parseFloat(rounded); // Convert string into a float 
                                   // (doesn't show decimals)
1
ответ дан 8 December 2019 в 02:04
поделиться

Равные дополнения к движку MS JScript: WScript.Echo (1083.6-1023.6) дает 59.9999999

0
ответ дан 8 December 2019 в 02:04
поделиться

Вы должны знать, что вся информация в компьютерах представлена ​​в двоичном формате, и разложение дробей в разных основаниях различается.

Например, 1/3 в базе 10 = 0,333333333333333333333333333, а 1 / 3 в базе 3 равно .1, а в базе 2 равно 0,0101010101010101.

Если у вас нет полного представления о том, как работают разные базы, вот пример:

Число по базе 4 301,12 . будет равно 3 * 4 ^ 2 + 0 * 4 ^ 1 + 1 * 4 ^ 0 + 1 * 4 ^ -1 + 2 * 4 ^ -2 = 3 * 4 ^ 2 +1+ 1 * 4 ^ -1 + 2 * 4 ^ -2 = 49,375 по основанию 10.

Теперь проблемы с точностью с плавающей запятой возникают из-за ограниченного количества бит в мантиссе. Числа с плавающей запятой состоят из 3 частей: знаковый бит, экспонента и мантисса, скорее всего, javascript использует 32- или 64-битный стандарт с плавающей запятой IEEE 754. Для более простых расчетов мы 0 10001000 11110100000000000000000

Теперь нам нужно умножить эти два числа. Умножение с плавающей запятой состоит из повторного прибавления скрытой единицы к обеим мантиссам, умножения двух мантисс, вычитания смещения из двух показателей степени и последующего сложения двух показателей степени вместе. После этого мантиссу нужно снова нормализовать.

Сначала 1.01000011110101110000101 * 1.11110100000000000000000 = 10.01111000011111111111111000100000000000000000 (это умножение мучительно)

Теперь очевидно, что у нас есть показатель степени 9 + показатель степени 0, поэтому мы сохраняем 10001000 как нашу экспоненту, а наш знаковый бит остается, так что все, что осталось, это нормализация.

Нам нужна наша мантисса должна иметь форму 1.000000, поэтому мы должны сдвинуть ее вправо один раз, что также означает, что мы должны увеличить нашу экспоненту, доведя нас до 10001001, теперь, когда наша мантисса нормализована до 1.00111100001111111111111111000100000000000000000. Он должен быть усечен до 23 бит, чтобы у нас осталось 1,00111100001111111111111 (не включая 1, потому что он будет скрыт в нашем окончательном представлении), поэтому наш окончательный ответ, который у нас остается, будет

Sign Bit (+)   Exponent(10)   Mantissa
0              10001001       00111100001111111111111

Наконец, если мы преобразуем этот ответ обратно в в десятичной системе получаем (+) 2 ^ 10 * (1+ 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -11 + 2 ^ -12 + 2 ^ -13 + 2 ^ -14 + 2 ^ -15 + 2 ^ -16 + 2 ^ -17 + 2 ^ -18 + 2 ^ -19 + 2 ^ -20 + 2 ^ -21 + 2 ^ -22 + 2 ^ -23) = 1264 . 99987792

Хотя я и упростил задачу, умножив 1000 на 1,265 вместо 10000 и используя одинарную плавающую точку вместо двойной, концепция осталась прежней. Вы используете потерю точности, потому что представление с плавающей запятой имеет только определенное количество бит в мантиссе, с помощью которых можно представить любое заданное число.

Надеюсь, это поможет.

11
ответ дан 8 December 2019 в 02:04
поделиться

Если вам нужно решение, прекратите использовать числа с плавающей запятой или удвоения и начните использовать BigDecimal. Проверьте реализацию BigDecimal stz-ida.de/html/oss/js_bigdecimal.html.en

1
ответ дан 8 December 2019 в 02:04
поделиться
Другие вопросы по тегам:

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