Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   глючит умножение (https://javascript.ru/forum/misc/25380-glyuchit-umnozhenie.html)

Скриптор 03.02.2012 14:39

глючит умножение
 
S = (0.05*14)+(0.1*2)
D = (0.1*14)/2+(0.1*2)
 
alert( 'S = ' + S + '\n'  +
     'D = ' + D 
)

результат в обоих случаях явно должен быть не такой как сейчас: 0.9000000000000001

Как добится нормальной арифметики от JavaScript?

Skipp 03.02.2012 14:50

Никак, округляйте.

B@rmaley.e><e 03.02.2012 14:52

Компьютеры плохо дружат с нецелыми числами. Нормальной арифметики можно добиться только для целых чисел.

Если Вы хотите вывести нецелое число в более-менее приличном виде, обрезайте его вывод до нескольких знаков после запятой (см. Number.prototype.toFixed)

Скриптор 03.02.2012 14:53

Цитата:

Сообщение от Skipp (Сообщение 155089)
Никак, округляйте.

Проверьте вручную или на калькуляторе: откуда там единица на конце маячит? Не должно её там быть!

Skipp 03.02.2012 15:04

Должно и это не только в javascript.
Если хотите углубиться то вот, может поможет.

Скриптор 03.02.2012 15:32

S = (0.05*100*14)/100+(0.1*100*2)/100
D = (0.05*14)+(0.1*2)

alert( 'S = ' + S + '\n'  +
     'D = ' + D 
)

И так не получается добиться правильного (точного) результата: все вокруг да около получается.

Скриптор 03.02.2012 15:34

Да, и как я могу прибегать к округлению, когда не понятно (исходя из предыдущего примера) где JS добавит или сбавит количество?!

poorking 03.02.2012 15:56

Цитата:

Сообщение от Maxmaxmaximus
т.е. не является десятичным.

т.е является восьмеричным

alert(020 === 16)

demoniqus 04.02.2012 14:52

т.к. судя по всему точность в javascript гарантирована лишь для целых чисел, то лично я пошел кривым путем - перевел исходные числа в строковое представление, затем убрал запятую (разумеется, запомнил количество десятичных знаков), преобразовал обратно в число (на сей раз целое) и произвел необходимые математические действия, затем опять преобразовал в строку, разобрался с количеством знаков после запятой и преобразовал в число. Конечно это сплошной гемор, но мне нужна была гарантия правильности... в общем пока работает в т.ч. и на тех же данных, которые при обычных методах вычисления давали весьма серьезную погрешность...


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