这部分代码应该不言自明,我的问题是我能否在 res 变量中得到 1242.08 结果,而不是 1242.07,因为在数学中
b = 1/(1/b)
在精度较低的 double 中,我似乎得到了不错的结果
我能否修正计算的小数部分以得到数学上正确的结果:
decimal rate = 124.2075M;
decimal amount = 10M;
decimal control = decimal.Round(rate * amount, 2); //it is 1242.08
//but
decimal res = decimal.Round(amount * (1 / (1 / rate)), 2);//1242.07 - should be 1242.08
decimal res1 = decimal.Round(amount * 124.2075M, 2);//1242.08 OK
/////////////////////////////////////////////////////////////
//while with double seems OK
double ratef = 124.2075;
double amountf = 10;
double resf = Math.Round(amountf * (1 / (1 / ratef)), 2);//1242.08 OK
double res1f = Math.Round(amountf * 124.2075, 2);//1242.08 OK
最佳答案
这是数据类型 decimal
的限制,最多可以容纳 29 digits
第一次计算的结果 (res1
) 不适合小数,因此您得到无效/不精确的结果。
decimal rate = 124.2075M;
decimal amount = 10M;
decimal res1 = (1 / rate); //0.0080510436165287925447336111M <- not enough decimal places
decimal res2 = (1 / res1); //124.20749999999999999999999991M
decimal res3 = amount * res2; //1242.0749999999999999999999991M
decimal res4 = decimal.Round(res3, 2); //1242.07M <- correct rounding
关于c# - c#中的小数舍入似乎是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392688/