< ScrollView ref = {(ref) => {this.scrollListReftop = ref; }}>
< / ScrollView>
// написать это, чтобы прокрутить сверху
this.scrollListReftop.scrollTo ({x: 0, y: 0, animated: true})
Числа с плавающей запятой не могут правильно обрабатывать десятичные дроби во всех случаях. Посмотрите
Это результат ошибки представления с плавающей запятой. Не все числа, которые имеют конечное десятичное представление, имеют конечное двоичное представление с плавающей запятой.
Прочтите эту статью . По сути, компьютеры и числа с плавающей запятой несовместимы друг с другом!
С другой стороны, 126500 равно 126499.99999999 ....:)
Так же, как 1 равно 0,99999999 ....
Потому что 1 = 3 * 1/3 = 3 * 0,333333 ... = 0,99999999 ....
Чисто из-за неточностей представления с плавающей запятой .
Вы можете попробовать использовать Math.round :
var x = Math.round(1.265 * 10000);
Эти небольшие ошибки обычно вызваны точностью чисел с плавающей запятой, используемых в языке. См. эту страницу в википедии для получения дополнительной информации о проблемах точности с плавающей запятой.
Вот способ решить вашу проблему, хотя, возможно, не очень красивый:
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)
Равные дополнения к движку MS JScript: WScript.Echo (1083.6-1023.6) дает 59.9999999
Вы должны знать, что вся информация в компьютерах представлена в двоичном формате, и разложение дробей в разных основаниях различается.
Например, 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 и используя одинарную плавающую точку вместо двойной, концепция осталась прежней. Вы используете потерю точности, потому что представление с плавающей запятой имеет только определенное количество бит в мантиссе, с помощью которых можно представить любое заданное число.
Надеюсь, это поможет.
Если вам нужно решение, прекратите использовать числа с плавающей запятой или удвоения и начните использовать BigDecimal. Проверьте реализацию BigDecimal stz-ida.de/html/oss/js_bigdecimal.html.en