Аномалия с добавлением 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,
а причем тут точность то? два флота складываем, в одном 0.2 в другом 0.4, а получаем 0.6000000000000001. Я бы понял если бы он наоборот округлял, так нет же... |
И что же это, если не точность?
|
но как тогда сделать чтобы в результате не было этой фигни?(
|
Вот мое решение:
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)) Но это ведь гавнокодище( Может кто поделится более изящным решением? |
В конце числа не может появляться ничего. Число это число, оно представлено внутри в каком-то своём формате с плавающей точной.
Появляется в строковом представлении числа. Если вам нужно именно строковое представление привести в нормальный вид, то да toFixed(), только разберитесь, в каком месте вы его вызываете. |
Тупое решение умножь на десять и дели на десять
<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 ведутся простым переводом в двоичную дальше действие и перевод обратно так что... |
vasa_c,
Нет, мне как раз строковое нафиг не сдалось! мне нужно все хранит в флоате( А нельзя как то определить объект, указав в поле сразу нужный тип? т.е.: var Obj = { x: something // x->float (вот как его явно определить флоатом?) } |
Siend, а ты уверен, что тебе эта десятиквадрилионная мешает?)
|
Часовой пояс GMT +3, время: 12:25. |