現在、C++を学習していますが、これはちょうど私に起こりました。私は単純な銀行プログラムを開発しようとしているので、これについては興味があります。ドル/金利の計算にはdouble
を使用しますが、コンピュータの計算と人間の計算には若干の違いがあります。floatとdoubleが正確でない場合、銀行はお金を含む正確な計算をどのように実行しますか?
私は、現実の世界のこれらの余分なペニーがすべて違いを生むことができると思います!
現在、C++を学習していますが、これはちょうど私に起こりました。私は単純な銀行プログラムを開発しようとしているので、これについては興味があります。ドル/金利の計算にはdouble
を使用しますが、コンピュータの計算と人間の計算には若干の違いがあります。floatとdoubleが正確でない場合、銀行はお金を含む正確な計算をどのように実行しますか?
私は、現実の世界のこれらの余分なペニーがすべて違いを生むことができると思います!
多くの場合、財務計算は浮動小数点の代わりに固定小数点演算を使用して行われます。
たとえば、.NET Decimal
タイプ、またはVB6 Currency
タイプです。これらは基本的に単なる整数型であり、単位は$ .0001のように何パーセントか分かります。
はい、いくつかの丸めが発生する必要がありますが、非常に体系的に行われます。通常、丸めルールは、契約の細かい部分のどこかにあります(利率はx%、Tごとに複合し、最も近いペニーに切り上げますが、各明細期間ごとに$ y以上)。
私は、ゲームの座標のための非常に正確な計算は整数計算でもよく行われることに同意します。浮動小数点計算には常に一定レベルの丸め誤差があります。 –
そんなことは思いませんでした、歓声。私は固定小数点演算を見ています。 もう一つの考えは、銀行が好意的に丸めを使用しているか、大量の利益を生み出しているか(常に大量の取引が発生していることを前提とする)です。 –
@Kurzon: "普通"のトランザクションには丸め誤差がありません。なぜなら、 '$ 1.23'をあなたに転送すると、私の残高はちょうど' 123c'だけ下がり、あなたのものは '123c'だけ上がってしまいます。それの世話。利子や手数料のようなものには適用されます。そこでは、少数の小数点が多少ある可能性があるパーセントの金額を掛けます。しかし、ベンのように、この規則はどこかの契約や法律によって規定されているという。あなたがハイスピードの裁定取引業者である場合は、丸めルールに気をつけてください。おそらく他の顧客はそうではありません。 –
数字が整数ではないという理由だけで、数値が正確に計算できないというわけではありません。 2つの小数点以下の桁数を使用して各数値に100を掛けるだけの固定小数点ライブラリの場合は、単価(セント)の数を数えた場合のドルとセントの値は整数であることを考慮して、整数として計算し、100で再度割ります。
長さが8バイトの範囲は、-9223372036854775808 max:9223372036854775807です。すべてを何千ドル/ペニーとしても、数千ドル/ポンド/何でも処理できます。
アプリケーションによって異なります。小数点を含むすべての計算では、ドルとセント(または、現地通貨である )を出力するとき丸めが必要です :商品の基本価格は小数点以下2桁しかない場合がありますが、付加価値税、そこには が多くなり、投資の利子を計算する必要がある場合は、 がさらにあります。お使いのソフトウェアが法律(税務上など)で必要とされる 簿記のいくつかの並べ替えのために使用されている場合は一般的に、最も正確な結果にdouble
結果を用いて、 しかし...、あなたは 標準に従うことが必要になることがあり
これらはバイナリ、16進または8進数ではなく、 の算術演算に基づいています。浮動小数点の場合は 浮動小数点の場合は—のバイナリは汎用ですが、 メインフレームです。そのような場合は、Decimal
クラスを使用する必要があります。これにより、正しい丸めが保証されます。他の用途(例:リスク 分析)の場合、double
は問題ありません。
check http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c –
このページにはたくさんの情報があります! –
http://introcs.cs.princeton.edu/java/91float/も参照してください。これは、CS学生のこの問題について詳しく説明しています。 – jvriesem