2017-01-18 3 views
3

Javascriptは単純な乗算の結果を誤って変更します。どうすれば修正できますか?

function roundUp(num, precision) { 
 
    return Math.ceil(num * precision)/precision; 
 
} 
 

 
var num = 0.07; 
 
var precision = 100; 
 
console.log(roundUp(num, precision));

関数の引数は、0.07および100である場合には、「NUM *精度」乗算「7.000000000001」のようなものを与え、切り上げ関数が8にそれを切り上げそして、私は完全に異なる結果を得ます理由もなく。

どうすればこの問題を解決できますか?私はbig.jsを持っていますが、うまく動かなかったのです。

+2

http://0.30000000000000004.com/ – cartant

+0

そこにどのような結果になりますか? –

+0

はこれを見ている:http://stackoverflow.com/questions/3072307/what-is-the-standard-solution-in-javascript-for-handling-big-numbers-bignum – ppasler

答えて

0

ここでもう一つの単純な試みは、天井の機能です。これは、代わりに7.00000000..1

再び完全にナイーブ試みで...私たちは6.9999999を得るように誤差要因がEPSILON時間によって数を減らす作るしようとします!

function roundUp(num, precision) { 
 
     return Math.ceil((num * precision) - (num * precision * Number.EPSILON))/precision; 
 
} 
 

 
console.log(roundUp(0.07, 100)) 
 
console.log(roundUp(0.03, 100)) 
 
console.log(roundUp(0.002, 1000)) 
 
console.log(roundUp(0.00222, 1000)) 
 
console.log(roundUp(0.006, 1000)) 
 
console.log(roundUp(0.00600000000000000000001, 10000000000000000000));//broken 
 
console.log(roundUp(0.006001, 10000000)); 
 
console.log(roundUp(0.0333, 1000)) 
 
console.log(roundUp(0.07777777, 10)) 
 
console.log(roundUp(0.07777777, 100)) 
 
console.log(roundUp(0.07777777, 1000)) 
 
console.log(roundUp(0.07777777, 10000)) 
 
console.log(roundUp(0.07777777, 100000)) 
 
console.log(roundUp(0.07777777, 1000000)) 
 

 
console.log(roundUp(0.33333333333333, 1000000))

+0

これは、OPのケースでは「正しい」値を提供しますが、浮動小数点の不完全性のために、他の場合には「不正確な」値を返す。さらに、数に戻って、その後、すべての文字列に番号とを変換することが非常に非効率的だろう。 –

+0

toFixedの使用は愚かです。その数値を基数10の文字列に変換してからすぐに基数2の浮動小数点数に戻します。あなたが幸運なことに、それが逆戻りするときにあなたは幸運を見て、それを逆にすることができます。 – Dave

+0

@AndrewSklyarevsky、Dave皆さんのご意見に私は同意します。 10〜12桁かもしれ後、私は通常、その部分をオフに放棄するので、素朴な試みをEPSILON率を参照してください。あなたが言ったようにこれは正確ではないと確信しています。 – sabithpocker

関連する問題