Decimal与double类型误差

 

int a = (int)(19.9 *100);   //19.9默认是double类型
 int b = (int)(19.9M *100 ); //将19.9转换成decimal类型

 Console.WriteLine(a);  //输出:1989

 Console.WriteLine(b);  //输出:1990

 

不用说.NET,C#,就是用Java来干估计也是这个结果,这个结果具有必然性.
19.9 作为 Double 类型表示,二进制形式是:
1 00000000110 011111001100110011001100110011001100110011001100110
(注意中间的两个空格,如果你不知道啥意思,就去查查double的内存表示形式吧)
但是19.9 * 100 由于是二进制运算的结果是
1 00000010011 111000101111111111111111111111111111111111111111111
由于后面有n个11111所以我猜测可能发生了溢出被计算机舍去了.
于是这个数字比 1990少那么一点点(可能是 1989.99999999...)
但是你的取整操作却直接截断了后面的数字,于是成了1989
至于你说9.9 29.9为什么不那样,那就是可能没有发生溢出了(不要以10进制的思维来猜测二进制)
别的语言你只能通过保留更高的精度并且四舍五入来实现,而C#为了支持金融运算,独家引入变态的Decimal类型,于是你的问题现在可以通过decimal解决了(decimal的精度非常高,大约有好几十层楼那么高吧...够用了)
二进制无法精确表示浮点数,小数部分一般都是用近似值来标示的。所以19.9*100的二进制标示会有那么多的11111111。而(int) (19.999999999)结果是直接截断小数点后面的结果,所以1989.999999也就是1989了。但是decimal为什么能正确呢,因为它根本就不存在真正的小数存储进制,所有的数都在小数点的右边。那它又是如何存储小数的呢,答案就是比例因子。当然还有符号位。

### 回答1: 将 decimal 转换为 double 的方法是使用显式转换,例如: ``` decimal decimalValue = 1.23m; double doubleValue = (double)decimalValue; ``` 需要注意的是,由于 double 存储的精度比 decimal 小,因此在进行转换时可能会丢失一些精度。 ### 回答2: decimal转double是进行数值类型的转换。decimalC#中的十进制数据类型,精度较高,适用于需要保留小数位的计算,而double是C#中的浮点数据类型,精度较低但取值范围更广。 要将decimal转换为double,可以通过简单的类型转换来实现。可以使用强制类型转换将decimal的值转为double类型。例如: decimal decimalValue = 12.345m; double doubleValue = (double)decimalValue; 在上面的例子中,我们创建了一个decimal类型的变量decimalValue,并初始化为12.345。然后使用强制类型转换将其转换为double类型的变量doubleValue。 需要注意的是,由于double的精度较低,转换过程会导致小数位的丢失或舍入误差。因此,在进行decimal转double时,可能会出现精度损失的情况。这是因为double的表示方式采用二进制浮点数表示法,而decimal采用十进制表示法。所以在进行类型转换时要注意是否会出现精度损失的问题。 总之,将decimal转double只需简单的类型转换即可实现,但要注意可能导致的精度损失问题。在实际应用中,需要根据具体的需求和计算精度来选择合适的数据类型。 ### 回答3: 在编程中,将十进制(decimal)转换为双精度浮点数(double)是一种常见操作。十进制是一种精确的数值表示形式,而双精度浮点数则使用二进制的科学计数法来表示数字,其精度和范围都比十进制要大。 要将十进制转换为双精度浮点数,可以使用语言中的内置函数或方法。以下是一个示例使用C#编程语言的例子: decimal decimalNumber = 3.14m; double doubleNumber = Convert.ToDouble(decimalNumber); 在这个例子中,我们先定义了一个十进制类型的变量decimalNumber,其值为3.14。然后,使用Convert.ToDouble()方法将十进制转换为双精度浮点数,并将结果存储double类型的变量doubleNumber中。 需要注意的是,十进制到双精度浮点数的转换可能会导致精度损失。由于十进制是精确的,而双精度浮点数只能以有限的位数表示数字,因此在转换过程中可能会丢失一些小数位的精度。 在进行任何类型转换时,都应注意源类型值是否超出了目标类型的表示范围。如果源类型的值过大或过小,可能会导致转换后的结果溢出或无法准确表示。 综上所述,将十进制转换为双精度浮点数是一种常见的操作,可以通过使用相应编程语言的内置函数或方法来实现。但在转换过程中需要注意精度丢失和值范围的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值