Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Получен неправильный результат математической операции (x00xer, оценка: 2)
Author Message
x00xer
Заглянувший



Joined: 16 Apr 2009
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 10:28 am (написано за 1 минуту 39 секунд)
   Post subject: Получен неправильный результат математической операции
Reply with quote

Всем привет подскажите, пожалуйста вот такая вот конструкция
alert(1-0.9)
выдает не ожиданный результат
0.09999999999999998
а как правильно нужно писать что б получить в полне ожадемый результат 0.1

Спасибо.

Last edited by x00xer on Fri Aug 21, 2009 11:18 am; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 11:08 am (спустя 39 минут; написано за 1 минуту 9 секунд)
   Post subject:
Reply with quote

x00xer,
во-первых. Никак нельзя, к сожаланию.

М

Во-вторых, что за название у темы?
forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html
Back to top
View user's profile Send private message Send e-mail
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 11:16 am (спустя 8 минут)
   Post subject:
Reply with quote

Например, округлять вручную до нужного знака после запятой. Например, до десятого:
Code (JavaScript): скопировать код в буфер обмена
var x = 1-0.9;

var position = 10;
var multiplier = Math.pow(10, position);
var result = Math.round(x*multiplier)/multiplier;

alert(x + '\n' + result);
Back to top
View user's profile Send private message
x00xer
Заглянувший



Joined: 16 Apr 2009
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 11:29 am (спустя 12 минут; написано за 1 минуту 45 секунд)
   Post subject:
Reply with quote

Александр Михалицын wrote:
x00xer,
во-первых. Никак нельзя, к сожаланию.
[m]Во-вторых, что за название у темы?
forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html[/m]
тему изменил, а почему никак ? это реально задумка такая ? или это действительно бага ?

кстати за решение ниже поставил плюс :-) хоть какое но решение.. -)
Back to top
View user's profile Send private message Send e-mail
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 11:34 am (спустя 4 минуты; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Ноги у этого феномена растут из двоичного представления чисел с плавающей точкой в компьютере. Почитать на эту тему можно хотя бы в Википедии (ru.wikipedia.org/wiki/Числа_с_плавающей_точкой).
Back to top
View user's profile Send private message
x00xer
Заглянувший



Joined: 16 Apr 2009
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 21, 2009 11:40 am (спустя 6 минут; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

Furax wrote:
Ноги у этого феномена растут из двоичного представления чисел с плавающей точкой в компьютере. Почитать на эту тему можно хотя бы в Википедии (ru.wikipedia.org/wiki/Числа_с_плавающей_точкой).
Спасибо :-) пошел читать.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Fri Aug 21, 2009 11:41 am (спустя 32 секунды; написано за )
   Post subject:
Reply with quote

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

if( a == b ) -- неправильно

if(Math.abs( a-b ) < epsilon), где epsilon зависит от порядка оперирумых Вами величин, и как правило его можно брать равным 10^(порядок-13).

Также это может быть важным при выводе соответствующих чисел. В большинстве случаев подойдет округление до нужного количества знаков с использованием метода toPrecision():

alert( (a-b).toPrecision(5)); -- выведет результат с точностью до 5 десятичных знаков. Собственно, пожалуй всё.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML