Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Аномалия с добавлением 0.000000000000001 к числу (https://javascript.ru/forum/misc/55083-anomaliya-s-dobavleniem-0-000000000000001-k-chislu.html)

Siend 13.04.2015 13:19

Аномалия с добавлением 0.000000000000001 к числу
 
Подскажите плиз кто знает, что за фигня такая? В конце числа появляется 0.000000000000001. Пробовал уже toFixed(3) в паре с parseFloat чтобы ограничить, не помогает. Откуда этот маленький

obj.acceleration.linear.y = 
     parseFloat( obj.acceleration.linear.y.toFixed(3) ) +
     parseFloat( this.gravitation.y.toFixed(3) ) //this.gravitation.y = 0.2 константа


Эта операция происходит в цикле обновления экрана. Там же вывожу значения obj.acceleration.linear:
0.2
0.4
0.6000000000000001
0.8
1
1.2
1.4
1.5999999999999999
1.8
2
2.2
2.4000000000000004
2.6
2.8000000000000003
3
3.2
3.4000000000000004

Откуда появляется этот непонятный остаток!!!??? И как от него избавится?

Octane 13.04.2015 13:24

гугли точность вычислений с плавающей точкой

Siend 13.04.2015 13:27

Octane,
а причем тут точность то? два флота складываем, в одном 0.2 в другом 0.4, а получаем 0.6000000000000001. Я бы понял если бы он наоборот округлял, так нет же...

vasa_c 13.04.2015 13:33

И что же это, если не точность?

Siend 13.04.2015 13:34

но как тогда сделать чтобы в результате не было этой фигни?(

Siend 13.04.2015 13:38

Вот мое решение:
obj.acceleration.linear.y = parseFloat(obj.acceleration.linear.y.toFixed(3)) + parseFloat(this.gravitation.y.toFixed(3))
obj.acceleration.linear.y = parseFloat(obj.acceleration.linear.y.toFixed(3))

Но это ведь гавнокодище( Может кто поделится более изящным решением?

vasa_c 13.04.2015 14:15

В конце числа не может появляться ничего. Число это число, оно представлено внутри в каком-то своём формате с плавающей точной.
Появляется в строковом представлении числа.
Если вам нужно именно строковое представление привести в нормальный вид, то да toFixed(), только разберитесь, в каком месте вы его вызываете.

Brutus 13.04.2015 14:41

Тупое решение умножь на десять и дели на десять

<body></body>
<script>
alert(0.4+0.2+"\n"+ (0.4*10 + 0.2*10)/10);
document.body.innerHTML = 0.4+0.2+"<br>"+ (0.4*10 + 0.2*10)/10;
</script>



Суть в самом js,
Аномалия из-за того что 0.2 в двоичной системе бесконечная дробь как впрочем и 0.4, а вычисления в js ведутся простым переводом в двоичную дальше действие и перевод обратно так что...

Siend 13.04.2015 17:20

vasa_c,
Нет, мне как раз строковое нафиг не сдалось! мне нужно все хранит в флоате( А нельзя как то определить объект, указав в поле сразу нужный тип? т.е.:
var Obj = {
x: something // x->float (вот как его явно определить флоатом?)
}

Erolast 14.04.2015 16:14

Siend, а ты уверен, что тебе эта десятиквадрилионная мешает?)


Часовой пояс GMT +3, время: 17:18.