2015-01-28 2 views
2

У меня проблема с округлением в JavaScript. Я использую функцию округления:Проблемы округления в JavaScript

function roundup(rnum, rlength){ 
    var newnumber = Math.round(rnum * Math.pow(10, rlength))/Math.pow(10, rlength); 
    return newnumber; 
} 

var amount = roundup(2253.825, 3); 

Странная вещь, когда я округлить число 2253.825, результат 2253.82 который должен быть 2253.83. Когда я округляю число 5592.825, результат 5592.83, что верно.

Любая идея, как исправить это?

+0

Связанный: http://www.smbc-comics.com/index.php?db=comics&id=2999 #comic :) – meskobalazs

+0

@Grimbode, взгляните на мою скрипку. Я добавил значение 2020.825, и это работает правильно. http://jsfiddle.net/poqnnxyo/2/ –

+0

Вопрос: Вы пытаетесь объединить _up_ или просто раунд? Если вы хотите округлить, то переход на 'Math.ceil' должен решить вашу проблему. – JLRishe

ответ

0

Ошибки округления с плавающей запятой здесь. 2620.825 * 100 - 262082.49999999997, поэтому, когда вы его округлите, результат 262082.

Вот более надежный подход, который исправляет это:

function round(rnum, rlength) { 
 
    var shifted = rnum * Math.pow(10, rlength), 
 
     rounded = Math.round(shifted), 
 
     delta = Math.abs(shifted - rounded); 
 

 
    if (delta > 0.4999999 && delta < 0.5) { 
 
     rounded += (rounded < 0 ? -1 : 1); 
 
    } 
 

 
    return rounded/Math.pow(10, rlength); 
 
} 
 

 
console.log("2620.825 :=> " + roundup(2620.825, 2)); 
 
console.log("2621.825 :=> " + roundup(2621.825, 2)); 
 
console.log("2620.8255 :=> " + roundup(2620.8255, 2));

+0

Спасибо, что делает эту работу! –

0

Проблема возникает из-за того, что способ работы IEEE 754 удваивается. Если вы действительно хотите получить математически правильные результаты, вам нужно использовать собственный тип данных, например, реализацию BigDecimal, например, this one.

Также обратите внимание на это answer, так как это может быть полезно.

Смежные вопросы