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

原文: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

时间: 2024-09-30 13:02:31

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

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

MySQL数据库float和decimal比较分析

float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据. [例子] 新建一个tab表(定义两个字段分别为float与decimal)  代码如下 复制代码 create table tab(col_f float(10,2), col_d decimal(10,2)); 插入两行记录,做为实验 insert into tab values(1234567.21, 1234567.21)

Sql Server中如何Float格式转换字符串varchar

SELECT CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2))) SELECT STR(@testFloat, 38, 2) 从Excel中导入到sql2000,有一列"联系方式"变成了float类型,我想转换成nvarchar类型,用下面的语句 select convert(nvarchar(30),convert(int,联系方式)) from employee go //数据溢出,不行! select convert(

type sizeof: char, short, int, long, float, double and prefix unsigned, long

C的自定义类型比较少, 占用字节数可以使用sizeof 操作符来获取.char, short, int, long, float, double char 实际存储为数字.占用1字节. 可使用的前缀 : unsigned, long 下面在一台64位的LINUX上得到的结果 : [root@db-172-16-3-150 zzz]# cat n.c #include <stdio.h> #include <string.h> #include <unistd.h> #i

udp-VC中如何将double转换为8个字节

问题描述 VC中如何将double转换为8个字节 在 UDP通信中,需要将double转换为8个char发送给对方如何做?收数时用memcpy将8个char转为double,现在要相反的函数 解决方案 VC++字节转换如何将 10 字节 Long 类型的值的 Double 转换为 8 字节 Double 解决方案二: 指向double的指针强制转换成指向char的指针,然后memcpy 解决方案三: sprintf格式化一个字符串流就行 解决方案四: 用共用体 union { double da

css中关于float的问题,

问题描述 css中关于float的问题, 解决方案 是被li1或者li2或者两者覆盖了吧,因为li1和li2是float的,所以大概是飘在li3上了,你清除一下浮动看看: 如果回答对你有帮助,请采纳 解决方案二: li3加上clear: both; li3的背景色应该在li1的下面,被li1覆盖了 解决方案三: .li3{ width:90px; height:90px; border-width:1px; border-color:green; background-color:green;

div中的float属性是影响到div本身还是其中的元素啊?

问题描述 div中的float属性是影响到div本身还是其中的元素啊? 在div中的float属性设置right值,那么div中的元素是向右浮动, 但是好像整个div框在父一级容器中也会向右浮动, 那么div中的float属性是影响到div本身还是其中的元素呢? 解决方案 会先影响到自己本身,然后它里面的元素也会跟着影响 解决方案二: 子div的margin属性影响到父div的定位 解决方案三: http://www.cnblogs.com/lrzw32/p/4948514.html:这个讲的挺

cstring-MFC中CString转Double,奇怪的现象

问题描述 MFC中CString转Double,奇怪的现象 代码如下: double CGPSViewerDlg::parseDouble(CString str){ //传入的str="3017.90736" int pos; if(str.GetLength()==0 || (pos=str.Find(_T(".")))<0 ) return 0; str.Delete(pos,1); str.Insert(pos-2,_T('.')); //出错的这里,

java中float,double利用BigDecimal运算

一.发现问题 float.double两种基本类型在运算的时候容易引起精度丢失.以float为例说明. public static void main(String[] args) {    float x = 1.0f;    float y = 0.8f;    float z = x - y;    System.out.println(z); } 结果是0.19999999 二.解决办法 利用java.math中的BigDecimal类进行操作 public static void ma