c# float、doble的精度问题
2021-04-04 01:28
标签:cts .net csdn 微软 表示 变量 类型转换 point head Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit single-precision floating point 7 ±1.5 × 10?45 to ±3.4 × 1038 double System.Double 64-bit double-precision floating point 15/16 ±5.0 × 10 ?324 to ±1.7 × 10308 如果我们在代码中写一个12.3,编译器会自动认为这个数是个double型。所以如果我们想指定12.3为float类型,那么你必须在数字后面加上F/f: 作为补充,decimal类型用来表示高精度的浮点数 Name CTS Type Description Significant Figures Range (approximate) decimal System.Decimal 128-bit high precision decimal notation 28 ±1.0 × 10?28 to ±7.9 × 1028 从上表可以看出,decimal的有效位数很大,达到了28位,但是表示的数据范围却比float和double类型小。decimal类型并不是C#中的基础类型,所以使用的时候会对计算时的性能有影响。 我们可以像如下的方式定义一个decimal类型的浮点数: 引用自:http://topic.csdn.net/t/20050514/20/4007155.html 中Ivony的评论
在精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。 c# float、doble的精度问题 标签:cts .net csdn 微软 表示 变量 类型转换 point head 原文地址:https://www.cnblogs.com/amber-vc/p/9192759.html浮点型
float f = 12.3F;decimal类型
decimal d = 12.30M;对decimal、float、double错误的认识
考虑下面的语句:
double dd = 10000000000000000000000d;
dd += 1;
Console.WriteLine ( "{0:G50}", dd );
输出是什么?谁知道?
输出是:1000000000000000000000000
这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。
浮点数的精度损失可能在很多地方出现,例如d * g / g 不一定等于d,d / g * g也不一定等于d。
还有两个非常危险的错误认识!!
1、decimal不是浮点型、decimal不存在精度损失。
下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!
decimal dd = 10000000000000000000000000000m;
dd += 0.1m;
Console.WriteLine ( "{0:G50}", dd );
2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。
微软在decimal的帮助上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。
文章标题:c# float、doble的精度问题
文章链接:http://soscw.com/index.php/essay/71903.html