2017-01-18 20 views
0

多くの場合toFixed() javascriptの数学で浮動小数点の失敗原因があります。javascript toFixed()

function toFixed(decimalPlaces) { 
var factor = Math.pow(10, decimalPlaces || 0); 
var v = (Math.round(Math.round(this * factor * 100)/100)/factor).toString(); 
if (v.indexOf('.') >= 0) { 
    return v + factor.toString().substr(v.length - v.indexOf('.')); 
} 
return v + '.' + factor.toString().substr(1); 
} 

と、この:

が、私はこの解決策を見つけ

function toFixed(num, fixed) { 
var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?'); 
return num.toString().match(re)[0]; 
} 

他のアプローチがありますが?私はどんな場合でもうまくいくことが確実でなければならない。また、境界線の場合も。

EDIT: https://github.com/MikeMcl/decimal.js @Tschallacka

Number.prototype.toFixed = function(fixed) { 
x = new Decimal(Number(this)); 
return x.toFixed(fixed); 
}; 

答えて

1

私はあなたがライブラリを使用することをお勧め:

https://github.com/MikeMcl/decimal.js

finanicalデータを扱うとき、私はそれが非常に頼りました。

浮動小数点数の操作は常に困難ですが、そこにはいくつかの解決策があります。 私はあなたがwellin maintaininライブラリを使用することをお勧めします。これはすでに赤ちゃんの歯が抜けていたものです。

decimal.jsを追加したと仮定すると、これは財務値に対して行うことができます。

/** 
 
* @var input float 
 
*/ 
 
function toFixed(input) { 
 
    var dec = new Decimal(input); 
 
    return dec.toFixed(2); 
 
} 
 
console.log("float to fixed 2 decimal places: ",toFixed(200.23546546546)); 
 

 

 

 
function toFixed2(decimalPlaces) { 
 
    var dec = new Decimal(1); 
 
    return dec.toFixed(decimalPlaces); 
 
} 
 
console.log("get a fixed num: ",toFixed2(10)); 
 

 
Number.prototype.toFixed = function(fixed) { 
 
x = new Decimal(Number(this)); 
 
return x.toFixed(fixed); 
 
}; 
 

 
var num = new Number(10.4458); 
 
console.log("Number to fixed via prototyped method: ",num.toFixed(2)); 
 

 
var x = 44.456 
 
console.log('Number to fixed via inderect number casting:' ,x.toFixed(2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/7.1.1/decimal.min.js"></script>

+1

それは便利です、ありがとう!しかし、私は "生産中"のソフトウェアを実装しなければなりません。私が持っているより良い方法は、toFixed関数を上書きすることです – Andreah

+0

toFixedラッパーで10進実装をラップしないのはなぜですか?あなたはtoFixedであなたが望むものを何でもすることができます。これらの機能にどのような種類のデータを提供しているかについての情報を提供できますか?文字列、整数、浮動小数点? – Tschallacka

+1

が浮かびます。私は価格形式(10.325は10.33でなければならない)でこれらの数字を約束する必要があります – Andreah

関連する問題