実験的な計算によって得られた、各値が数値キーを持つ辞書を作成しようとしています。
double
一意性または同等性に関して 2 つの浮動小数点数を比較するのは難しいため、他の浮動小数点型はキーとして使用するのに適していません。
Decimal
この点で良い候補者であるかどうか誰かが知っていますか? 別の方法は、指定された精度で倍精度を文字列に変換することですが、それは私には洗練されていない回避策のように思えます。
実験的な計算によって得られた、各値が数値キーを持つ辞書を作成しようとしています。
double
一意性または同等性に関して 2 つの浮動小数点数を比較するのは難しいため、他の浮動小数点型はキーとして使用するのに適していません。
Decimal
この点で良い候補者であるかどうか誰かが知っていますか? 別の方法は、指定された精度で倍精度を文字列に変換することですが、それは私には洗練されていない回避策のように思えます。
float
またはdecimal
を辞書のキーとして使用することに大きな違いはありません。どちらも指数で数値を表すため、スケールが異なるだけで同じ比較の問題が発生します。
「ほぼ同じ値」のキーが必要な場合は、同様の結果を同じバケットに入れるために既知の方法で値を丸めるカスタムキーにする必要があります。 ..
decimal
orを使用している場合は、十分な大きさがないdouble
ため、代わりに使用することを検討してください。int
long
また、分数/小数部分がなく、整数のみが含まれている限り、decimal
sまたはsを比較しても問題ないと思います(-1、0、1、2、3など)double
(ただし、将来の予期しないエラーを回避するために、比較が重要な場合にdecimal
/を使用することはお勧めしません)double
6桁の精度のみを扱う場合は、にキャストしてint
も問題ありません。
これは古い質問であることは知っていますが、私の答えが誰かを助けることができると信じています。
フロートキーが本当に必要でした。
もちろん、精度の問題に遭遇し、私の辞書は必要以上に大きくなりました (たとえば、同じものとして扱われるようにしたかった1.0
の0.999998
です)。相対誤差ははるかに普遍的ですが、比較に絶対誤差を使用するため、10進数の固定数を使用することは優れた解決策ではありません(たとえば、OPによって提案されているように文字列に変換する)。
私は次のメソッドを書くことになりました:
float Quantize(float x)
{
const float relMaxQuantError = 0.001f;
float ret = Mathf.Log10(Mathf.Abs(x));
float quantum = Mathf.Log10(1+relMaxQuantError);
ret = Mathf.Floor(ret/quantum) * quantum;
ret = Mathf.Sign(x) * (Mathf.Pow(10, ret));
return ret;
}
辞書に格納する前に、このメソッドを使用して float を量子化します。最大許容相対誤差は const で制御できます (現在は 0.1 % です)。
PS: Mathf
Unity のクラスです。標準を使用するように簡単に調整できますMath
。