2016-08-08 5 views
-1

私の角度のあるJSアプリケーションでは、1つのオブジェクトに3つの量があります。 Chromeブラウザデバッガでは、私は次のようになります:2つの10進数のAngular JS不正確な減算

payment.amountForClosing = payment.amountRemaining - payment.amountReserved;

payment.amountRemainingはpayment.amountReservedがサブスpayment.amountForClosing後2478.4

の値を有する547.7999999999997の値を有し、及び547.8が表示され3026.2

の値を有します。 ユーザーが別のお支払いをクローズしようとすると、私の検証ロジックは、上に示した状態のためにお支払いが完了するのに十分なお金がないことを示すエラーを返します。

これらの値の値は、System.DecimalタイプとしてC#WebApi 2.0バックエンドから取得されます。

+1

基本2の浮動小数点数の性質です。 –

+0

その性質をどう扱うか?私は比較的新しいJavaScriptには – vpetrovic

+0

これはあなたがその問題に対処するのに役立つ[記事](http://www.2ality.com/2012/04/number-encoding.html)です。 –

答えて

3

通貨を扱う際には、わかるように、最悪のことは浮動小数点数を使用することです。フロートがどのように格納されるかの方法のために、いくつかの操作が間違った結果をもたらすかもしれません。常に正しくなるのは、10の累乗による除算/除算だけです。

通貨をInteger/BigIntegerなどとして保存し、それを保存することをお勧めします。 12100が1.21

を表すべきで小数点以下4桁はそうその後、整数の減算/乗算を行うことができますし、最後に10

私の提案の力で除算あなたはその後、任意の操作の前に整数にこれらの数字を変換することですそれを再びフロートに分割します。

+0

私の提案がありますか? – JoeriShoeby

+0

私はこの問題に戻りました。私は整数で解決しようとしています。私はちょうど私がこの権利をしているかどうかをチェックしたいと思っています: function add(a、b){ return((a * 10000)+(b * 10000))/ 10000; } – vpetrovic

+0

もしaとbが4桁の小数点を持っていれば、それ以上のものがあれば、丸めたり、床に丸めたり、* 10000とb * 10000にすることをお勧めします。 – PerunSS

1

Javascriptの浮動小数点精度については、以前に説明しました(たとえば、hereまたはhere)。次のオプションがあります。

  1. すべての数字を整数に変換します。
  2. フォーマット.toFixed(2)
  3. を使用して有効桁の固定数の結果は、私が@PerunSSに同意するこれらの全てのうちBigDecimal

のように小数のための特別なデータ型を使用することをお使いの場合は、最良の選択肢演算を行う前に数値を整数に変換し、それらを元に戻します。

関連する問題