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

icf*_*ntv 5 c#

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

由于一些我无法控制的设计约束,需要对其进行转换.转换为字符串不是问题.转换为double是因为MS文档说"[从十进制转换为双倍]会产生舍入错误,因为双精度浮点数的有效位数小于小数位数."

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

Jon*_*eet 13

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

但是,您肯定应该制定某种计划以避免double将来使用- 但这对于财务计算来说是不合适的数据类型.

  • @djacobson:财务计算通常以*表示*小数 - 人们期望添加(比如)0.01和0.01的结果是*正好*0.02.这是'double`中的技巧,其中0.01和0.02都不能精确表示.当然,如果你(比如说)除以3,你仍然会丢失一些信息...但是每个人都更容易理解(并且可能决定政策)因为我们都习惯于十进制算术.一般来说,自然不精确的数量,如身高和体重,有利于双倍; 精确的,人造的数量对十进制有好处. (6认同)