关于decimal类型计算的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于decimal类型计算的问题相关的知识,希望对你有一定的参考价值。

decimal a = 9300 * (100m / 300);
这样计算出来的结果是:3099.9999999999999999999999997M。
要怎样才能让其计算出来的结果是3100?

参考技术A 既然是要计算结果为3100m,那么就不应该用ToString()这种方式。decimal.Ceiling()是可取的,它得到的是一个整数值,通常在一个计算过程中应该象下面这样:
decimal a = Math.Round(9300m * (100m / 300m));
在需求有变动时可以通过修改Round方法的参数来很方便的确定结果保留几个小数。希望对你有帮助,还有疑问请追问或是Hi
参考技术B decimal a = 9300 * (100m / 300);

string aa=a.ToString("F0");
aa的值就是"3100" 这里F0就是保留0位小数 F1就是保留1位 F2就是保留2位 以此类推
参考技术C ToString("N0")表示,转换为舍去小数的字符串.
decimal ass = decimal.Parse( (9300 * (100m / 300)).ToString("N0"));).

参考技术D decimal.Ceiling(a)

关于在MySql的decimal中犯的一个错-此篇文章目的在于警醒自己

今天在运行一段程序的时候报了Out of range value错误,网上的解释是说这个值与数据库字段类型不匹配,然而程序里面设置的是BigDecimal,数据库设置的是decimal,没有多想就把sql语句copy出来在数据库执行,发现是OK的,就有点懵逼了,然后就各种Debug,没有发现任何问题,后来去看了数据库设计,发现数据库的这个字段设置的是decimal(10,10),于是乎就打脸了;

太大意了,程序里面的sql语句直接执行没有报错,没有多想就认为是程序的问题,然而执行结果却是这个样子的

 

由于程序里面获取到的值是大于0的数字,所以程序层面就直接报错的,但是直接执行Sql语句的时候MySql底层估计是做了优化,不管传什么值,都给我变成0.9999999999;

发出来让自己涨涨记性;

decimal(x,y):x代表数字长度,y代表小数点占得长度;decimal(10,10)一共就唱10位,其中小数点就占了10位,所以在程序里面一旦这个值大于1就会报错,这个字段的值永远只能在 -0.9999999999 到 0.9999999999;

以上是关于关于decimal类型计算的问题的主要内容,如果未能解决你的问题,请参考以下文章

C#decimal是啥类型以及它的作用

decimal对应java啥类型

收益计算器(用decimal类型)

EF关于decimal精度的问题

关于mysql的decimal类型的外键的一个特殊限制

计算 System.Decimal 精度和比例