C# decimal类型的计算问题

问题描述

如题,(decimal)100/(decimal)300*(decimal)60的运算结果是多少?20?是19.999999999999999999999999998有点费解。(double)100/(double)300*(double)60的运算结果是20有点无法理解,求解!感谢!

解决方案

解决方案二:
精度不一样。
解决方案三:
正常,浮点数的精度损失造成的。
解决方案四:
楼上都正解
解决方案五:
回答要么浅尝辄止,要么似是而非,都毫无用处
解决方案六:
double是64位的,比single-32位精度高decimal128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。通常都是这么介绍的。
解决方案七:
double是64位浮点保留的精度少decimal是128位浮点,他精度保留的多所以他的结果跟接近正确然后表达式运算,只能说表达式解析规则解析的表达式树决定他先运算100/300,所以两边保留的精度问题导致运算的精度问题
解决方案八:
引用

不会出现浮点数计算的误差

首先这句话是错滴,不是不会出现浮点运算误差,而是他有误差,他也是浮点数,但是128位的精度比较高,对于普通金融运算这个精度可以认为比较高
解决方案九:
decimal是定长小数类型(decimal)100/(decimal)300*(decimal)60得19.999999999999999999999999998是因为你没有指定小数位数,且使用了低精度算式(100/300是无限循环小数)(decimal)100/(decimal)300实际是0.3333333333333333333333333333(28位小数)后面的就截断了(decimal)100*(decimal)60/(decimal)300就得到20了不会出现浮点数计算的误差,是说他会按金融运算的规则对超宽的小数部分做舍入(不是简单的四舍五入)你示例的算式,正好演示了数值运算时误差的产生
解决方案十:
引用6楼wanghui0380的回复:

double是64位浮点保留的精度少decimal是128位浮点,他精度保留的多所以他的结果跟接近正确然后表达式运算,只能说表达式解析规则解析的表达式树决定他先运算100/300,所以两边保留的精度问题导致运算的精度问题

我奇怪的是,这时候double反而正常了,难道是巧合?我之前说的话也只是引用了一下,对于各种信息,我觉得有点迷惑。
解决方案十一:
引用8楼xuzuning的回复:

decimal是定长小数类型(decimal)100/(decimal)300*(decimal)60得19.999999999999999999999999998是因为你没有指定小数位数,且使用了低精度算式(100/300是无限循环小数)(decimal)100/(decimal)300实际是0.3333333333333333333333333333(28位小数)后面的就截断了(decimal)100*(decimal)60/(decimal)300就得到20了不会出现浮点数计算的误差,是说他会按金融运算的规则对超宽的小数部分做舍入(不是简单的四舍五入)你示例的算式,正好演示了数值运算时误差的产生

我知道(decimal)100*(decimal)60/(decimal)300就得到20了,按照一直一来学习的印象感觉应该先约分,再计算,对吧?基于这个认识,我想了解一下,我举例的算法decimal得到的结果,反而是19.999999……?这是问题部分一,难道我一直以来的算术原则有问题?问题部分二,而这时候double的计算却是20,这是凑巧吗?还是说两种数据类型对表达式的理解不一样?以上两部分问题,是我觉得不了解的。在此也特别感谢一下认真作答的wanghui0380和xuzuning!

时间: 2024-11-02 18:29:27

C# decimal类型的计算问题的相关文章

从具体化“System.Decimal”类型到“System.Int32”类型的指定强制转换无效

问题描述 程序错误信息:System.InvalidOperationException:从具体化"System.Decimal"类型到"System.Int32"类型的指定强制转换无效.在System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReaderreader,Int32ordinal)在lambda_method(Closur

数据库Decimal类型,和Double类型数字比较大小?

问题描述 数据库Decimal类型,和Double类型数字比较大小? System.out.println(list.get(0).get("sum(c.couponfee/100)")); BigDecimal sum = new BigDecimal((Double)(list.get(0).get("sum(c.couponfee/100)"))); BigDecimal max = new bigd /* for(int i=0;i BigDecimal s

hibernate3处理mqsql数据库decimal类型比较查询出错

问题描述 项目中用到别人创建的数据库,不能修改数据库结构,商品表中有个销售价格字段 sell_price decimal(11,2),要对它进行比较查询,大致就是要查价格处于什么范围的商品,这里以大于或等于为例(即最低价格).Condition类未查询条件类,里面有id和minPrice等属性.我用hibernate3操作数据库,报出如下错误,请知道解决办法的仁兄不灵赐教,不胜感激.实现代码public List<Products> getProductsList(Condition cond

ASP.NET中如何将decimal 类型的数据 存在 ORACLE数据库

问题描述 ASP.NET中如何将decimal类型的数据存在ORACLE数据库 解决方案 解决方案二:Oracle数据库中Number类型的参数的值可以用.NETdecimal或System.Data.OracleClient.OracleNumber类型指定:Integer类型的参数的值可以用.NETint或OracleNumber类型指定解决方案三:NUMBER12,7

IIS 5.1 上运行不支持转换Decimal类型小数点解决方法

iis 5.1 上运行不支持转换decimal类型小数点解决方法 解决问题的方法: 在web.config文件中的system.web 节点中加上: <globalization  culture="国家代码" uiculture ="国家代码"/> 如:  <globalization culture="en-us" uiculture ="en-us"/>  

Mysql中NUMERIC和DECIMAL类型区别比较

decimal(numeric ) 同义,用于精确存储数值 . decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法:不存储值的近似值. 定义 decimal 的列.变量和参数的两种特性如下: p 小数点左边和右边数字之和,不包括小数点.如 123.45,则 p=5,s=2. 指定精度或对象能够控制的数字个数. s 指定可放到小数点右边的小数位数或数字个数. p 和 s 必须遵守以下规则:0 <= s <=

mssql修改数据库Float到decimal类型无法修改表

错误提示 "MBom"表 - 无法修改表. The query has been canceled because the estimated cost of this query (598) exceeds the configured threshold of 300. Contact the system administrator. 解决办法 在修改后的Designer上右键,选这个,把内容考出来,新建一个查询 在最上面加这么一句  代码如下 复制代码 SET QUERY_GO

double相加(減)结果会有些误差

原文:double相加(減)结果会有些误差   前提介绍       今天在调试代码的时候发现了一个double类型数据相减的有趣问题,148163.1 - 82692.09大家猜猜结果等于多少,经过调试最终为5471.010000000009. 是不是很奇怪,下面将说明这其中的奥妙! 原因说明      double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再

MySQL数字类型int与tinyint、float与decimal如何选择

最近在准备给开发做一个mysql数据库开发规范方面培训,一步一步来,结合在生产环境发现的数据库方面的问题,从几个常用的数据类型说起. int.tinyint与bigint 它们都是(精确)整型数据类型,但是占用字节数和表达的范围不同.首先没有这个表就说不过去了: Type Storage Minimum Value Maximum Value (Bytes) (Signed/Unsigned) (Signed/Unsigned) TINYINT 1 -128 127 0 255 SMALLINT