c# - c#中的小数舍入似乎是错误的

标签 c# double decimal

这部分代码应该不言自明,我的问题是我能否在 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/

相关文章:

c++ - double - pow()

c# - 在 C# 中将分数转换为 float

python - 将字符串总和打印为 float

c# - 显示小数而没有尾随零的最佳方法

c# - 如何在本地修改纹理?

c# - WPF 中的预测键入功能

ios - 有什么方法可以在 swift 4 中迭代 double var 的小数部分吗?

c# - 结合两个整数来创建一个唯一的数字

c# - 对包含新添加的自定义类型的列表进行排序

Java Double setScale 和 RoundingMode 在 C# 中等效吗?