2

データベースにいくつかのデータを保存し、それらのデータをカーソルで読み取ります。すべてのデータは 56.45 、 3.04 、 0.03 型なので、小数点以下 2 桁です。今、それらを合計したいのですが、簡単ではないようです...それらの数を取得c.getDouble(3)してから、次のように合計変数に追加します。

sum+= c.getDouble(4) * multi

multi は 1 から 100 までの整数です。私の問題は、sum 変数を取得した後、59.51999999999999999 のような数値が得られることです。コードは投稿しませんがstring.valueOf、ウィジェットに番号を表示する以外に変換はありません。それで、これを経験した人はいますか?数えると 59.52 になるはずですが、代わりに 99999 という数字が表示されます... なぜそうなってしまうのでしょうか? (面白いことに、aMath.round()が機能しない場合、(sum)*100 / 100 を設定しても 59.0 になります。よろしくお願いします!

4

2 に答える 2

9

あなたの数字はあなたには 10 進数で表されますが、コンピューターには 2 進数で表されます。

10 進数でも 2 進数でも、一部の分数は正確に表すことができません。

たとえば、1/3 は 10 進数で正確に表すことはできません。0.3333333333 のようなもので概算できます。しかし、3 * 0.3333333333 を実行しようとすると、1.0000000000 ではなく 0.9999999999 になります。

バイナリでは、同じ問題がありますが、分数が異なります。

そのため、10 進数から 2 進数に変換して元に戻すと (浮動小数点演算を行うためにコンピューターが基本的に行う必要があることです)、10 進数ではすべての数値が完全に正確であっても、精度に小さな誤差が生じることがあります。コンピューターがバイナリの近似値を使用すると、近似値が導入され、小さなエラーが発生します。

これは実際、プログラミングでは非常に一般的な問題です。詳細については、What Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください。

于 2012-06-16T17:09:02.877 に答える
3

他のアプローチでは、合計変数を次のように定義してから、合計変数をdouble設定できNumberFormatます。

例:

double sum = 21.2015;
NumberFormat formatter = new DecimalFormat("#.##");
formatter.format(sum);
于 2012-06-16T17:11:41.190 に答える