如何在c#中安全地从双精度转换为小数

时间:2011-02-18 17:46:40

标签: c#

我们使用十进制数据类型将财务数据存储在SQL Server数据库中,我们需要6-8位精度的十进制数。当我们通过数据访问层将这个值返回到我们的C#服务器时,它将以十进制数据类型返回。

由于某些设计限制超出了我的控制范围,因此需要进行转换。转换为字符串不是问题。转换为double是因为MS文档说“从十进制转换为双倍”会产生舍入错误,因为双精度浮点数的有效位数小于小数位数。“

作为双重(或字符串),我们可以在完成任何计算后舍入到2位小数,那么进行小数转换的“正确”方法是什么,以确保在舍入之前我们不会丢失任何精度?

2 个答案:

答案 0 :(得分:13)

转换不会在前8位数内产生错误。 double具有15-16位精度 - 小于decimal的28-29位数,但足以满足您的目的。

你肯定应该制定某种计划以避免将来使用double,但这是一种不适合财务计算的数据类型。

答案 1 :(得分:4)

如果你舍入到2dp,IMO的“正确”方式将存储一个整数倍 - 即12.34你存储整数1234.不再有双舍入的祸患。

如果您必须使用double,这仍然有效;所有整数都保证完全存储为double - 所以仍然使用相同的技巧。