这部分代码应该不言而喻,我的问题是我可以在 res 变量中得到 1242.08 结果,而不是 1242.07,因为在数学中
b = 1/(1/b)
Run Code Online (Sandbox Code Playgroud)
在精度较低的 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
Run Code Online (Sandbox Code Playgroud)
这是decimal最多可容纳29 位数字的数据类型的限制
第一次计算 ( 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
Run Code Online (Sandbox Code Playgroud)