1

数値のデルタ値を見つけたい。
これでやってみました。Abs関数を使用しました。整数に対しては正常に機能しています。
しかし、次のことをしようとすると、

var gh = Math.Abs(3.223 - 6.243);  

戻ります3.0200000000000005。しかし、私は期待してい 3.02ます。
なんで?入手方法は3.02

4

6 に答える 6

7

本質的に100%正確ではないfloat/double値を使用しているためです(バイナリ表現によるものです)。たとえば0.1、浮動小数点数のバイナリ表現は定期的であるため、正確にすることさえできません1.(1001)。これは、この問題に関する非常に完全な記事です。すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

Tl;dr 解決策はdecimal、正確な 10 進算術演算に使用することです

var gh = Math.Abs(3.223m - 6.243m); 
于 2012-12-18T09:09:20.120 に答える
3

どちら3.2236.243バイナリ浮動小数点で正確に表現できません。の希望する答え3.02も正確に表現できません。

正確な 10 進演算が必要な場合は、decimal型を使用する必要があります。例えば:

var gh = Math.Abs(3.223m - 6.243m);  

これにより、ghタイプdecimalが になり、希望する正確な値が得られます。リテラルのmサフィックスは、 type の値を示すために使用されますdecimal

役立つリソース

于 2012-12-18T09:09:58.977 に答える
2

このように数値を表示する必要がありますか、それともさらに計算に使用しますか?

表示するには、文字列の書式設定を使用できます。それをさらに計算に使用する場合は、このままにして、数値を表示する必要がある場所に切り捨てを適用する必要があります。

于 2012-12-18T09:20:17.323 に答える
1

私は正しい価値を得ています。に変換してみてくださいDecimal。適切な精度が得られる可能性があります。

decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));

幸運を!

于 2012-12-18T09:07:27.043 に答える
1

Can you maybe try this : var sgh= gh.ToString("0.00", CultureInfo.CurrentCulture);

于 2012-12-18T09:08:50.097 に答える
1

必要な桁数によって異なります。小数を使用する場合は、 var gh = Convert.ToDecimal(Math.Abs​​(3.223 - 6.243)); になります。

于 2012-12-18T09:11:58.760 に答える