双数据类型不适合我的数据/计算吗?

时间:2016-04-28 09:03:39

标签: c# types

我的单元测试因此而失败,所以我想知道我是否使用了正确的数据类型?

阅读双重的规格我认为应该没问题,但这就是发生的事情:

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

然后我将它转换为double,然后乘以10000。

执行乘法运算的函数是:

private static double? MultiplyBy10000(double? input)
        {
            if (!input.HasValue)
            {
                return null;
            }
            return input.Value*10000;
        }

接下来是即时窗口:

input.Value
0.0175
input.Value*10000
175.00000000000003

这就是我的单元测试失败的原因,因为我期待175。

双重不够准确吗?

检查其他值:

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个测试用例 0,0155 0,0225 0.016 0,0175 0,0095 0.016 0.016 0,0225 0,0235 0,0265

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

2 个答案:

答案 0 :(得分:5)

  

双重不够准确吗?

不,双打是浮点数,是inaccurate by design。如果您需要确切的数字,可以使用decimal这是准确的,更合适的。

答案 1 :(得分:1)

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

在您按比例缩放数字后,使用Math.Round修剪小数点右侧的日期。