原文:C#中对于float,double,decimal的误解

一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖。

浮点型





如果我们在代码中写一个12.3,编译器会自动认为这个数是个double型。所以如果我们想指定12.3为float类型,那么你必须在数字后面加上F/f:

float f = 12.3F;

decimal类型

作为补充,decimal类型用来表示高精度的浮点数



对decimal、float、double错误的认识

引用自:http://topic.csdn.net/t/20050514/20/4007155.html
中Ivony的评论

在精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。

考虑下面的语句:  

   

             
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要小。

本文来自CSDN博客,http://blog.csdn.net/ccy3253/archive/2008/01/28/2070616.aspx

C#中对于float,double,decimal的误解的更多相关文章

  1. MySQL中的float和decimal类型有什么区别

    decimal 类型可以精确地表示非常大或非常精确的小数.大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性.该类型对于必须避免舍入错误的应用程序( ...

  2. 关于c中 int, float, double转换中存在的精度损失问题

    先看一段代码实验: #include<limits> #include<iostream> using namespace std; int main() { unsigned ...

  3. oracle 的 nubmer 类型与 C# 的 float double decimal 对应关系

    如果先有oracle 数据的情况下,怎么对应到C#中的类型. 在oralce 中 在dba_tab_columns表中, Data_type表示字段类型:Data_length表示字段类型的长度:Da ...

  4. float,double,decimal使用讨论

    注意:有效位:小数点前后的全部数字,不包括小数点在内 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64b ...

  5. C++11中int,float,double与string的转化

    在C++11中可以使用std::to_string()函数将数值转换为string格式,十分方便. 以下部分来选自cplusplus.com. std::to_string string to_str ...

  6. MySQL类型float double decimal的区别

    语法 MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQ ...

  7. C# int uint long ulong byte sbyte float double decimal 范围,及类型!

    static void Main(string[] args) { Console.WriteLine(" byte {0,7:g}{1,32:g}{2,32:g}",typeof ...

  8. Android中 int,float,Double,String 互相转换

    1 如何将字串 String 转换成整数 int?  A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...

  9. MySQL如何选择float, double, decimal

    http://yongxiong.leanote.com/post/mysql_float_double_decimal

  10. MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景

    MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...

随机推荐

  1. poj 动态规划的主题列表和总结

    此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...

  2. Linux内核升级

    一.测试环境 CentOS6.5 X86 64位 内核版本为 2.6.32 VM 10.07 二.编译内核版本 2.1.kernel 3.2.71 2.2.kernel 3.4.108 2.3.ker ...

  3. hdu3732(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 题意:Ahui学习英语单词,每个单词都是不同的,并且都有自身的价值量 w 和难度值 c (0&l ...

  4. CSDN 四川大学线下编程比赛第二题:Peter的X

    题目详情: http://student.csdn.net/mcs/programming_challenges Peter是个小男孩.他总是背不清26个英文字母. 于是,刁钻的英语老师给他布置了一个 ...

  5. 用Java写个ftp传输类实现文件的上传和下载,用ikvmc转成dll

    1.Java类: package com.wjy.ftp.transmission; import java.io.File; import java.io.FileOutputStream; imp ...

  6. Android中Broadcast Receiver组件具体解释

    BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...

  7. 完美攻略心得之圣魔大战3(Castle Fantisia)艾伦希亚战记(艾伦西亚战记)包含重做版(即新艾伦希亚战记)

    (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...

  8. error U1087: cannot have : and :: dependents for same target

    windows驱动开发遇到错误: 1>e:\winddk\7600\bin\makefile.new(7117) : error U1087: cannot have : and :: depe ...

  9. windows phone 墓碑化(9)

    原文:windows phone 墓碑化(9) 几个术语的理解: 名称 说明 ;        App ap = (App)Application.Current;        // 构造函数    ...

  10. 一个非常优秀的前端框架--BootStrap

    在接触BootStrap之前,也许我们已经度过了很多关于前端开发的框架及