关于c#:双数据类型是否不适合我的数据/计算?

Is the double data type not suitable for my data / calculation?

本问题已经有最佳答案,请猛点这里访问。

由于这个原因,我的单元测试失败了,所以我想知道我是否使用了正确的数据类型?

读到双人床的规格,我想应该没问题,但这就是发生的事情:

我正在从一个文件中读取一个值为0,0175的字符串(逗号表示十进制sep)。

然后我把它转换成一个双精度数,然后乘以10000。

进行乘法运算的函数是:

1
2
3
4
5
6
7
8
private static double? MultiplyBy10000(double? input)
        {
            if (!input.HasValue)
            {
                return null;
            }
            return input.Value*10000;
        }

下一个是从即时窗口:

1
2
3
4
input.Value
0.0175
input.Value*10000
175.00000000000003

这就是我的单元测试失败的地方,因为我期望175。

这个双精度不够吗?

也检查了其他值:

1
2
3
4
5
6
7
8
9
10
input.Value*1
0.0175
input.Value*10
0.17500000000000002
input.Value*100
1.7500000000000002
input.Value*1000
17.5
input.Value*10000
175.00000000000003

奇怪的是,我有12个测试案例00155002250016001750009500160016002250023500265

断言其中4个,其他3个没有这种行为


Is the double not accurate enough for this?

不,双精度数是浮点数,设计上不准确。您可以使用decimal,如果您需要确切的数字,这是准确和更合适的。


小数点右边的值不是2的幂的浮点数无法准确表示。虽然你得到了0.0175的数据,但实际上还有更多的数据。

放大数字后,使用math.round将小数点右边的日期去掉。