Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.04.2015, 13:19
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Аномалия с добавлением 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

Откуда появляется этот непонятный остаток!!!??? И как от него избавится?
Ответить с цитированием
  #2 (permalink)  
Старый 13.04.2015, 13:24
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

гугли точность вычислений с плавающей точкой
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2015, 13:27
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Octane,
а причем тут точность то? два флота складываем, в одном 0.2 в другом 0.4, а получаем 0.6000000000000001. Я бы понял если бы он наоборот округлял, так нет же...
Ответить с цитированием
  #4 (permalink)  
Старый 13.04.2015, 13:33
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

И что же это, если не точность?
Ответить с цитированием
  #5 (permalink)  
Старый 13.04.2015, 13:34
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

но как тогда сделать чтобы в результате не было этой фигни?(
Ответить с цитированием
  #6 (permalink)  
Старый 13.04.2015, 13:38
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Вот мое решение:
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))

Но это ведь гавнокодище( Может кто поделится более изящным решением?
Ответить с цитированием
  #7 (permalink)  
Старый 13.04.2015, 14:15
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

В конце числа не может появляться ничего. Число это число, оно представлено внутри в каком-то своём формате с плавающей точной.
Появляется в строковом представлении числа.
Если вам нужно именно строковое представление привести в нормальный вид, то да toFixed(), только разберитесь, в каком месте вы его вызываете.
Ответить с цитированием
  #8 (permalink)  
Старый 13.04.2015, 14:41
Кандидат Javascript-наук
Отправить личное сообщение для Brutus Посмотреть профиль Найти все сообщения от Brutus
 
Регистрация: 24.11.2013
Сообщений: 127

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

<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 ведутся простым переводом в двоичную дальше действие и перевод обратно так что...

Последний раз редактировалось Brutus, 13.04.2015 в 14:45.
Ответить с цитированием
  #9 (permalink)  
Старый 13.04.2015, 17:20
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

vasa_c,
Нет, мне как раз строковое нафиг не сдалось! мне нужно все хранит в флоате( А нельзя как то определить объект, указав в поле сразу нужный тип? т.е.:
var Obj = {
x: something // x->float (вот как его явно определить флоатом?)
}
Ответить с цитированием
  #10 (permalink)  
Старый 14.04.2015, 16:14
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск