注意:有效位:小数点前后的全部数字,不包括小数点在内

float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)

double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

float f = 345.98756f;//结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。

double d=345.975423578631442d;//结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。

注:float和double的相乘操作,数字溢出不会报错,会有精度的损失。

decimal dd=345.545454879.....//可以支持28位,对最后一位四舍五入。

注:当对decimal类型进行操作时,数值会因溢出而报错。

对于三种类型的变量定义:

float f = 123.123f;

double d = 123.123321d;

decimal m = 123.23123123m;

至于为什么要后面带后缀了,解释如下:

举个例子:f代表这个数据是float类型的常量,因为如果你直接输入45.63就是double类型 ,当你赋给float类型的时候就会抛异常了,也就是说,如果你不加f
你就要这样赋值
float amount = (float)45.63;

那我们再深入挖掘里面的含义:

以下内容转自:http://www.cnblogs.com/lovewife/articles/2466543.html

浮点型

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:

float f = 12.3F;

decimal类型

作为补充,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类型的浮点数:

decimal d = 12.30M;

对decimal、float、double错误的认识

在精确计算中使用浮点数是非常危险的,尽管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要小。

“decimal   类型是适合财务和货币计算的   128   位数据类型。”

当然,decimal在大多数情况下是安全的,但浮点数在理论上是不安全的。

至于精度误差造成的显示问题,则是很容易修补的。浮点数会带来的问题以及整型能避免的问题就是一个:

譬如说从A帐户转账到B帐户,经计算得出结果是3.788888888888888元,那么我们从A帐户扣除这么多钱,B帐户增加这么多钱,但事实上A帐户不一定会扣除准确的数值,例如A帐户的金额在100000000000,那么这个时候100000000000   -   3.788888888888888运算结果很有可能是99999999996.211111111111112。而这个时候B帐户的金额为0则很有可能加上准确的数值,如3.788888888888888,这样一来,0.011111111111112元钱就会不见了,日积月累的,差额就会越来越大。

double是64位的,比single-32位精度高

decimal128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差

,decimal   类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

早上刚到办公室,就被中试室打来电话叫去,原来软件在测试过程中发现了个小问题:软件读出来的数据比设备LCD上显示数据小了 0.01 。

怎么会这样呢,数据类型我已经用了 double 型了整个数据长度也就6位,double型的数据有效数据位为7位,也够了阿,不明白。于是回来下断点跟踪。

前面double型在算的时候,是没问题的,数据是66.24,可是当我把66.24 乘上100后的处理结果就不对了:66.24*100.0d = 6623.9999…91,问题就出在这里了。查了msdn,Double型的数据:Double 值类型表示一个值介于 -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字,浮点数只能近似于十进制数字,浮点数的精度决定了浮点数近似于十进制数字的精确程度。默认情况下,Double 值的精度是 15 个十进制位,但内部维护的最大精度是 17 位。所以就出现了乘上一百后,精度就不够了。又由于我们在处理数据时,是不允许四舍五入的,所以,经过单位转换后,软件中最终显示的数据为 66.23 ,比LCD上显示的66.24 小了 0.01。

因此,这之后就想到了应该用更高精度的 decimal 型。

类型

大致范围

精度

.NET Framework 类型

decimal

±1.0 × 10e?28 至 ±7.9 × 10e28

28 到 29 位有效位

System.Decimal

在声明decimal类型数据时,可以 a: decimal myData = 100,此时编译器隐式转换整型数100为 100.0m;当然也可以b: decimal myData = 100.0m,但是 如果是 decimal myData = 100.0d或者decimal myData = 100.0f,就不行了,因为100.0d或者100.0f,编译器认为是浮点数,而浮点数和decimal 类型之间不存在隐式转换;因此,必须使用强制转换在这两种类型之间进行转换。This is the important,否则编译器便报错。所以一般的财务软件在处理时,都会用decimal 类型。

好了,改用decimal 型之后,就OK 了,结果就完完整整地显示为 66.24 了。

float,double,decimal使用讨论的更多相关文章

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

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

  2. MySQL类型float double decimal的区别

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

  3. 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 ...

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

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

  5. 什么时候需要使用Double? double、float、decimal的区别

    原文:什么时候需要使用Double? double.float.decimal的区别 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double: ...

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

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

  7. MySQL中 DECIMAL FLOAT DOUBLE的区别

    第一篇文章: MySQL中Decimal类型和Float Double等区别 MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,d ...

  8. 数据库类型空间效率探索(五)- decimal/float/double/varchar

    以下测试为userinfo增加一列,列类型分别为decimal.float.double.varchar.由于innodb不支持optimize,所以每次测试,都会删除表test.userinfo,重 ...

  9. MySQL中Decimal类型和Float Double等区别

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

随机推荐

  1. Unity2D 背景图铺满与Camera.Size的计算公式

    在unity制作2D游戏的教程,背景图sprite铺满显示时Camaer的Size调到多少合适,作个笔记. 资源参数 background.png 2048x640,Sprite的像素单位:100 调 ...

  2. java9-7 成员内部类的修饰符

    1. 成员内部类的修饰符: private 为了保证数据的安全性 static 为了方便访问数据 注意:静态内部类访问的外部类数据必须用静态修饰. 案例:我有一个人(人有身体,身体内有心脏.) cla ...

  3. sqlzoo.net刷题5

    List the continents that have a total population of at least 100 million. 这题考察的是使用集聚函数生成表之后,如何过滤 一般我 ...

  4. HTML5-WebSocket技术学习(2)

    上一篇介绍了websocket的基本用法.这篇介绍websocket的一个框架: socket.io socket.io是一个既可以用在客户端又可以用在服务器端的框架. 本篇介绍socket.io在客 ...

  5. MahApps.Metro怎么调用消息窗口

    网上查看了好多资料,没有找到很清楚明了的结果,经过了多天的研究,无意发现了这个方法来进行全局调用 效果展示:

  6. C语言 简单的栈

    //简单的栈 #include<stdio.h> #include<stdlib.h> //栈的介绍:栈先进后出,一般用于将数据逆序输出 //栈一般只有四种方法--进栈,出栈, ...

  7. Ajax实现异步操作实例_针对XML格式的请求数据

    js分类中有一节[原生js异步请求,XML解析]主要说明了js前台是如何处理XML格式请求和如何接受由服务器返回的XML数据的解析,今天我将用一个实例来说明具体要如何操作. 前台的参数类型也是XML使 ...

  8. NPOI 导出excel带图片,可控大小

    using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI.DDF;using NPOI.SS.UserModel;using System.I ...

  9. ActionBar在Android2.x的实现,类似新版微信界面。

    ActionBar完美兼容Android4.x的机型,虽然现在Android2.x的系统越来越少,还有有一部分人使用的仍是2.x的系统,所以我们还得考虑着兼容性问题. 对比图: Test例子与微信的对 ...

  10. Arduino小车学习与研究

    信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...