Jes*_*ter 6 c# methods decimal
我正在编写一个简单的方法来计算小数值中的小数位数.该方法如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
我已经针对一些测试值运行它以确保一切正常但是在最后一个上得到了一些非常奇怪的行为:
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);
Run Code Online (Sandbox Code Playgroud)
测试1-5工作正常,但test6返回23.我知道传入的值超过了最大小数精度,但为什么23?我发现奇怪的另一件事是当我在来自test6的调用之后在GetDecimalPlaces方法中放置一个断点时,方法中的decimalNumber的值来自test5(20个小数位)的相同值,即使该值传入有20个小数位23返回.
也许只是因为我传递了一个数字,这个数字有太多的小数位并且事情变得不稳定但我想确保我不会遗漏一些根本错误的东西,这可能会导致其他值的计算失败路.
你实际测试的数字是这样的:
0.0000000001000000000100000000
Run Code Online (Sandbox Code Playgroud)
这是最接近的精确十进制值,为0.0000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001.
所以正确的答案实际上是20.然而,你的代码给你23因为你使用二进制浮点运算,没有明显的原因.这将会在计算中引入错误,完全不必要.如果你改为一致地使用十进制,那很好:
public static int GetDecimalPlaces(decimal decimalNumber) {
int decimalPlaces = 1;
decimal powers = 10.0m;
if (decimalNumber > 0.0m) {
while ((decimalNumber * powers) % 1 != 0.0m) {
powers *= 10.0m;
++decimalPlaces;
}
}
return decimalPlaces;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |