小数の小数点以下の桁数を計算する簡単なメソッドを書いています。メソッドは次のようになります。
public int GetDecimalPlaces(decimal decimalNumber) {
try {
int decimalPlaces = 1;
double powers = 10.0;
if (decimalNumber > 0.0m) {
while (((double)decimalNumber * powers) % 1 != 0.0) {
powers *= 10.0;
++decimalPlaces;
}
}
return decimalPlaces;
私はいくつかのテスト値に対してそれを実行して、すべてが正常に機能していることを確認しましたが、最後の値でいくつかの本当に奇妙な動作を取り戻しています:
int test = GetDecimalPlaces(0.1m);
int test2 = GetDecimalPlaces(0.01m);
int test3 = GetDecimalPlaces(0.001m);
int test4 = GetDecimalPlaces(0.0000000001m);
int test5 = GetDecimalPlaces(0.00000000010000000001m);
int test6 = GetDecimalPlaces(0.0000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001m);
テスト1〜5は正常に機能しますが、test6は23を返します。渡される値が最大小数精度を超えていることはわかっていますが、なぜ23なのですか?私が奇妙だと思ったもう1つのことは、test6からの呼び出しに続いてGetDecimalPlacesメソッド内にブレークポイントを設定した場合、メソッド内のdecimalNumberの値は、test5からの値(小数点以下20桁)と同じ値になりますが、渡された小数点以下の桁数は20で、23が返されます。
小数点以下の桁数が多すぎて不安定な数値を渡したからかもしれませんが、後で他の値の計算が失敗する可能性のある根本的に間違ったものを見逃していないことを確認したいと思います。道。