2

私が今理解している限り、Decimal は Double の 2 倍の大きさです (128 ビット対 64 ビット)。そのため、より高い精度で数値を表すことができます。ただし、バイナリの代わりに基数 10 の数値システムも使用します。Decimal の最後の特性が次の結果に影響するのではないでしょうか?

Microsoft (R) F# Interactive version 11.0.60610.1
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> let x = 1.0m / 3.0m ;;
val x : decimal = 0.3333333333333333333333333333M

> x * 3.0m ;;
val it : decimal = 0.9999999999999999999999999999M

> let y = 1.0 / 3.0 ;;
val y : float = 0.3333333333

> y * 3.0 ;;
val it : float = 1.0

> it = 1.0 ;;
val it : bool = true

ご覧のとおり、Double は 3.0 による除算と乗算の後、再び 1.0 として出力されます。さまざまな除数を試しましたが、状況は同じです。
(F# を知らない人への注意 -float基本的に F# では同義語ですdouble)

4

2 に答える 2

1

観察している動作はdouble、1/3 を 3 倍した結果のスケールが 1/3 とは異なることに起因します。この状況は、常に正確に 3 桁の 10 進数を維持し、1.00/7.00 (結果は .143) を計算し、その結果に 7 を掛けた場合 (正確な値は 1.001 になりますが、丸められる場合) に似ています。 1.00 に)。基本的に、除算は有効数字 (元の数値は 0.01 までの精度でしたが、0.001 までの精度) を取得し、乗算によって正しい結果が得られるようにします。

typeを使用すると、正確に格納できなくDecimalても、乗算によってスケールが変更されて丸めステップが必要になる場合、(where ) の値はしばしば等しくなります。(1D/3D)*3D で 1D が得られない理由は、おおよそ 7.923 を超える値では、10 のべき乗ごとに右側の小数点以下の桁数が 1 桁減るのに対し、0.7922 未満の値では桁が増えないためです。したがって、7.923 ~ 23.76 の範囲の値を 3 で割り、be 3 を掛けると元の値になります。同様に、値 79.23 から 233.76 などを使用する場合も同様です。7.923 未満の値を 1 より大きい値で除算することは、結果が 10^-28 の正確な倍数になる場合を除いて、通常は元に戻すことができません。x/y(x/y)*y1 < y < 10xDecimal

于 2013-09-11T20:30:45.060 に答える