2011-02-18 100 views
5

我们正在使用十进制数据类型将财务数据存储在SQL Server数据库中,我们需要十进制精度的6-8位数字。当我们通过我们的数据访问层将这个值返回到我们的C#服务器时,它将作为十进制数据类型返回。如何在c中安全地从一个双精度转换为十进制#

由于我无法控制的一些设计限制,这需要进行转换。转换为字符串不是问题。转换为double是因为MS文档中提到“[从十进制转换为双精度]可能会产生舍入误差,因为双精度浮点数的有效位数少于小数。”

作为双(或字符串),我们可以在任何计算完成后舍入到小数点后两位,那么做什么是“正确”的方式来做十进制转换,以确保在舍入之前我们不会失去任何精度?

+2

根据MSDN,十进制的精度为28-29位,双精度为15-16。但是如果你只存储6-8位数字,那么我认为这个舍入不会影响你。这可以很容易地单元测试看到。 – nithins 2011-02-18 17:51:27

回答

13

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

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

+1

击败我的评论15秒! (+1):) – nithins 2011-02-18 17:52:35

+0

*“这是一个不适合财务计算的数据类型。”*您会在闲暇时详细说明这一点吗?这是我一直“知道”而不一定理解的事情之一。干杯! :) – 2011-02-18 17:54:33

3

如果您轮到2dp,IMO“正确”的方式将存储一个整数倍数 - 即12.34你存储整数1234.没有更多的双舍入悲哀。

如果你必须使用双倍,这仍然有效;所有整数都保证精确地存储两倍 - 所以仍然使用相同的技巧。

相关问题