1

次のパラメーターfloat.TryParse(value、NumberStyles.Float、CultureInfo.InvariantCulture、out fValue)を使用して、変数を解析してfloatにしようとしている間

value=6666.77777は6666.778に丸められます。

誰か助けてもらえますか、私は自分の価値を丸めたくありません。

4

4 に答える 4

3

float有効数字は約6桁しかありません。小数点のの桁もカウントされることに注意してください。doubleその点で精度が高くなります(約16):

PS> [float]::Parse('6666,77777')
6666.778
PS> [double]::Parse('6666,77777')
6666.77777

しかし、他の人が指摘したように、これは基数 2 で正確に表すことができないため、単なるおおよその値ですdecimal。他のほとんどの場合、バイナリ浮動小数点 (つまりfloatdouble) で問題ありません。

于 2012-10-23T06:04:22.753 に答える
1

これは、値 666.77777 を浮動小数点数で使用するバイナリ形式で表すことができないためです。実際の数値には、浮動小数点数に余裕があるよりも多くの 2 進数が含まれています。結果の数値は最も近い近似値です。

丸めは、浮動小数点演算 (または浮動小数点形式への変換) の正確な結果が仮数部の桁数よりも多くの桁数を必要とする場合に使用されます。IEEE 754 では正しい丸めが必要です。つまり、丸められた結果は、値を計算するために無限に正確な算術演算が使用されてから丸められたかのようになります (ただし、実装では、これを保証するために必要な追加ビットは 3 つだけです)。いくつかの異なる丸めスキーム (または丸めモード) があります。歴史的に、切り捨ては典型的なアプローチでした。IEEE 754 の導入以来、デフォルトの方法 (最も近いものに丸め、偶数に結び付け、バンカーの丸めと呼ばれることもあります) がより一般的に使用されています。

doubleより高い精度が必要な場合、またはそれ以上の精度が必要な場合は、使用を検討する必要がありdecimalますが、それらもある時点で精度が低下します。

于 2012-10-23T06:03:47.900 に答える
1

より高い精度をサポートするために、 Double.TryParseまたはDecimal.TryParseを使用しないのはなぜですか。

float : 有効数字7桁で±1.5×10-45~±3.4×1038程度

double : 有効数字 15 桁または 16 桁で、約 ±5.0 x 10-324 ~ ±1.7 x 10308

decimal : 有効数字 28 桁または 29 桁で、約 ±1.0 x 10-28 ~ ±7.9 x 1028

代わりに、次のコード スニペットを試してください。

double fValue;
double.TryParse("6666.77777", NumberStyles.Double, CultureInfo.InvariantCulture, out fValue);

また

decimal fValue;
decimal.TryParse("6666.77777", NumberStyles.Decimal, CultureInfo.InvariantCulture, out fValue);
于 2012-10-23T06:08:54.850 に答える
0

decimalより高い精度が必要な場合に使用する必要があります。

于 2012-10-23T06:03:26.050 に答える