数値のデルタ値を見つけたい。
これでやってみました。Abs
関数を使用しました。整数に対しては正常に機能しています。
しかし、次のことをしようとすると、
var gh = Math.Abs(3.223 - 6.243);
戻ります3.0200000000000005
。しかし、私は期待してい 3.02
ます。
なんで?入手方法は3.02
?
数値のデルタ値を見つけたい。
これでやってみました。Abs
関数を使用しました。整数に対しては正常に機能しています。
しかし、次のことをしようとすると、
var gh = Math.Abs(3.223 - 6.243);
戻ります3.0200000000000005
。しかし、私は期待してい 3.02
ます。
なんで?入手方法は3.02
?
本質的に100%正確ではないfloat/double値を使用しているためです(バイナリ表現によるものです)。たとえば0.1
、浮動小数点数のバイナリ表現は定期的であるため、正確にすることさえできません1.(1001)
。これは、この問題に関する非常に完全な記事です。すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと
Tl;dr 解決策はdecimal
、正確な 10 進算術演算に使用することです
var gh = Math.Abs(3.223m - 6.243m);
どちら3.223
も6.243
バイナリ浮動小数点で正確に表現できません。の希望する答え3.02
も正確に表現できません。
正確な 10 進演算が必要な場合は、decimal
型を使用する必要があります。例えば:
var gh = Math.Abs(3.223m - 6.243m);
これにより、gh
タイプdecimal
が になり、希望する正確な値が得られます。リテラルのm
サフィックスは、 type の値を示すために使用されますdecimal
。
役立つリソース
このように数値を表示する必要がありますか、それともさらに計算に使用しますか?
表示するには、文字列の書式設定を使用できます。それをさらに計算に使用する場合は、このままにして、数値を表示する必要がある場所に切り捨てを適用する必要があります。
私は正しい価値を得ています。に変換してみてくださいDecimal
。適切な精度が得られる可能性があります。
decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));
幸運を!
Can you maybe try this : var sgh= gh.ToString("0.00", CultureInfo.CurrentCulture);
必要な桁数によって異なります。小数を使用する場合は、 var gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243)); になります。