我正在编写一个简单的方法来计算十进制值中的小数位数。该方法如下所示:
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?我发现奇怪的另一件事是,当我在来自 test6 的调用之后在 GetDecimalPlaces 方法中放置一个断点时,该方法中的 decimalNumber 的值与来自 test5 的值(20 个小数位)相同,但即使该值传入的有 20 位小数返回 23。
也许只是因为我传递了一个小数位太多的数字,事情变得很不稳定,但我想确保我没有遗漏一些根本错误的东西,这可能会导致稍后计算其他值路。