2011-07-05 4 views
5

私はjavascriptで予算アプリケーションを作成しています。私はjavascriptにほとんどの操作をさせる必要があります。だから私はいくつかのコントロールを持っているユーザーは、カテゴリの希望量を変更し、私のアプリケーションは、サブカテゴリの新しい金額を表示します。 だから私は +オート$ 50.23 している場合 - ユーザーは、90.00になどガス、メンテナンス、保険、の金額を自動50.23を変更するのであれば...JavaScriptによる通貨操作ですか?

- ガス$ 30.25 - メンテナンス$取れて6.27 - 保険$ 10.02 を親カテゴリーの増加%を反映します。

問題は、いくつかの作業の後、私は精度を失うことであり、それはいくつかの厄介なバグを作成します。ほとんどの場合、数値は加算されません。 autoの値を数回変更して0に設定した後、他の値は常に0になるとは限りません。また、0より小さくなるとNaNが返されるため、後でAutoを0より大きい値に変更すると、私のNaNはNaNのままです。

私はちょうど誰かがJavaScriptでの分画は別の問題である近似値であることを言うのを聞きました。私は何だろう、私はあなたのいくつかは同様の問題に遭遇していると確信している

(多分私は右の用語のために見ていない)、これが事実であるかどうかを確認するには、Googleしようとしましたが、何かを見つけることができませんでした提案する? 誰かが元の数字に100を掛けてからすべての操作を行うように提案しましたが、これは精度が失われるという問題を解決するのに役立ちません。

アイデア?

私はあなたの助けに感謝します!

+0

JSのすべての数は、浮動小数点数ですが、2位の数字にはあまり精度を失うべきではありません。 FPの丸めが問題になるには、文字通り数千から数百万回の繰り返しが必要です。あなたは計算のどこにあなたのコードの関連するビットを表示できますか?私たちはページ全体を必要としません。 –

+0

あなたはおそらく、ドルやセント(すべて整数)のようなプロパティを持つ独自のクラスを作成し、独自の操作を実装することができます – spacevillain

+0

fp追加エラーはJavaScriptで最もよく報告されるエラーです。 – jzilla

答えて

9

小数浮動小数点数は小数部を扱う際には不適格なので、0.1 + 0.2は0.3に等しくありません。これは JavaScriptで最も頻繁に報告されたバグであり、それは、2進浮動小数点演算のための IEEE規格(IEEE 754)を採用したことの意図的な結果です。この規格は、多くの アプリケーションに最適ですが、中学校の数字について学んだことのほとんどに違反しています。幸いにも、 浮動小数点の整数演算は正確です。したがって、10進表現の誤差はスケーリングによって回避できます。 たとえば、ドル値は100を掛けてセントセントの値に変換できます。次にセントを に正確に追加することができます。合計を100で割ってドルに変換することができます。人々は の合理的な期待を持っています。

"JavaScript:Douglas Crockfordのグッドパーツ" Copyright 2008 Yahoo Inc.、 978-0-596-51774-8。 "

3

常に通貨で内部的に整数として、それを追跡します。すべての操作は整数で行う必要があります。表示する小数点のみを持つ。

check out this fiddle小数点を使ってお金を追跡することを考えている場合は、

+0

ここでは更新されたfiddle:http://jsfiddle.net/PfPbt/15/の違いと推奨される解決方法をご覧いただけます。 –