2012-04-25 3 views
3

Я знал, что javascript может иметь проблему округления с делениями, но не с умножением. Как вы их решаете?javascript, выпуск с номером округления

var p = $('input[name="productsUS"]').val().replace(",", "."); 
var t = $('input[name="productsWorld"]').val().replace(",", "."); 

if (p >= 0 && t >= 1) { 
    var r = p/t; 
    r = Math.round(r * 10000)/10000; 
    var aff = (r * 100) + "%"; 

если p = 100 и t = 57674

r = 0.0017 (ОК) и aff = 0.16999999999999998% (ARG)

Как я мог получить aff = 0.17?

+0

http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – Romhein

+0

у вас все еще есть проблемы? – gdoron

+0

Решение Nop, toFixed() было решением. Я просто дал время людям, чтобы ответить и выбрать. – Kraz

ответ

0

Это ошибка в JavaScript (хотя это также влияет на несколько других языков, таких как Python), из-за, как он хранит, не целые числа является бит-багги (двоичный!). Единственный способ обойти это - округлить до двух знаков после запятой.

+0

Возможно, вы имели в виду два знака после запятой ... – gdoron

+0

Да, исправлено это. – callumacrae

+0

Это не ошибка, это ограничение ... – Kraz

1

Если вы хотите aff оставаться номер вместо того, чтобы быть преобразованы в строку, вы можете использовать toFixed работать вокруг точных вопросов, а затем «слепок» его обратно в число с помощью одинарного + оператора следующим образом:

var n = 0.16999999999999998; 

n = +n.toFixed(10); // 0.17 

Возможно, вы захотите использовать более высокую точность, чем 2 десятичных знака, чтобы избежать проблем округления, я использовал здесь 10.

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