说说C#的数学类,Math,浮点数(上)
2015-08-16 18:16
691 查看
说说C#的数学类,Math,浮点数
C#语言支持下图所示的数值类型,分别是整数,浮点数和小数
可能不是很清楚,但是仔细看看还是能看清楚的.
在一个C#程序中,整数(没有小数点的数)被认为是一个int类型(除非其值大于最大的int值),根据数据值,该数据依次被视为uint,ling,ulong,带小数点的数被认为是一个double值.这就是说(1.0).GetType()==typeof(double).
其中类型前面的字母’u’代表无符号的意思.因为无符号,所以u代表了数据是整数或0,不可能是负数.
检查整数溢出
考虑下面代码:
short s=32767;s+=1;
ushort us=0;us-=1;
在第一个情况下,一个有符号的数加1,经过其最大值,由于整数在内存中存储方式的原因,结果是-32768.
第二种情况,一个无符号的数被减为小于0,结果将是65535.
这两个例子分别是上溢出和下溢出的情况,如果想避免这种情况的发生,可以使用checked关键字:
short s=32767;
checked
{
s+=1;//将会产生一个上溢出
}
或者使用下面的编译器开关:
/checked+
默认编译器开关对应为:
/checked-
迄今为止,都在收运行时的整数向上或向下溢出检查,在默认情况下编译器会将编译时的向上和向下溢出标记为一个错误,而和你的编译器开关无关.
例如语句:short s=32767+1;这会产生一个编译时错误,因为在编译期间对加法进行求值.
例如下面这个案例;
const int i1=65536;
const int i2=65536;
int i3=i1*i2;
因为i1,i2都是const值,所以编译器在编译的时候会尝试对i3=i1*i2进行求值,并遇到一个向上溢出.所以会导致编译错误.
编译器开关不会覆盖这一行为,但是unchecked关键字可以覆盖这种行为.
int i3=unchecked(i1*i2)可以正常通过编译.
小数类型
decimal关键字表示128位数据类型.同浮点型相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和后比计算.decimal类型的大致范围和精度看上面的图.
它使用16字节(128位)存储每一个值.128位被划分为96位整数位,一个符号位,一集一个可以在0-28之间变化的比例因子.在数学上,这个比例因子是一个10的负指数幂,表示数值中小数点位置的编号.
例如,如果一个小数定义等于12.34,那么这个数的存储方式是整数0x4D2(后1234),以及一个比例因子2.
只要一个小数具有(或小于)28个有效数字以及(或小于)28个小数位置,decimal 数据类型就可以准确的存储它.对于浮点数而言,这是不成立的.\!如果定义一个float值等于12.34,那么它会被存储为0xC570A4(或12939428)除以0x100000(或1048576),这个值等于12.340000152587890625约等于12.34,即使将一个double值定义为12.34,他也是一个约等于12.34的数.
这就是你爱不想让美分神秘的出现和消失的地方执行计算时应该使用decimal的原因,因为浮点数不精确,浮点数据类型在科学和工程应用方面很合适,但是在金融应用不好使.
C#语言支持下图所示的数值类型,分别是整数,浮点数和小数
可能不是很清楚,但是仔细看看还是能看清楚的.
在一个C#程序中,整数(没有小数点的数)被认为是一个int类型(除非其值大于最大的int值),根据数据值,该数据依次被视为uint,ling,ulong,带小数点的数被认为是一个double值.这就是说(1.0).GetType()==typeof(double).
其中类型前面的字母’u’代表无符号的意思.因为无符号,所以u代表了数据是整数或0,不可能是负数.
检查整数溢出
考虑下面代码:
short s=32767;s+=1;
ushort us=0;us-=1;
在第一个情况下,一个有符号的数加1,经过其最大值,由于整数在内存中存储方式的原因,结果是-32768.
第二种情况,一个无符号的数被减为小于0,结果将是65535.
这两个例子分别是上溢出和下溢出的情况,如果想避免这种情况的发生,可以使用checked关键字:
short s=32767;
checked
{
s+=1;//将会产生一个上溢出
}
或者使用下面的编译器开关:
/checked+
默认编译器开关对应为:
/checked-
迄今为止,都在收运行时的整数向上或向下溢出检查,在默认情况下编译器会将编译时的向上和向下溢出标记为一个错误,而和你的编译器开关无关.
例如语句:short s=32767+1;这会产生一个编译时错误,因为在编译期间对加法进行求值.
例如下面这个案例;
const int i1=65536;
const int i2=65536;
int i3=i1*i2;
因为i1,i2都是const值,所以编译器在编译的时候会尝试对i3=i1*i2进行求值,并遇到一个向上溢出.所以会导致编译错误.
编译器开关不会覆盖这一行为,但是unchecked关键字可以覆盖这种行为.
int i3=unchecked(i1*i2)可以正常通过编译.
小数类型
decimal关键字表示128位数据类型.同浮点型相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和后比计算.decimal类型的大致范围和精度看上面的图.
它使用16字节(128位)存储每一个值.128位被划分为96位整数位,一个符号位,一集一个可以在0-28之间变化的比例因子.在数学上,这个比例因子是一个10的负指数幂,表示数值中小数点位置的编号.
例如,如果一个小数定义等于12.34,那么这个数的存储方式是整数0x4D2(后1234),以及一个比例因子2.
只要一个小数具有(或小于)28个有效数字以及(或小于)28个小数位置,decimal 数据类型就可以准确的存储它.对于浮点数而言,这是不成立的.\!如果定义一个float值等于12.34,那么它会被存储为0xC570A4(或12939428)除以0x100000(或1048576),这个值等于12.340000152587890625约等于12.34,即使将一个double值定义为12.34,他也是一个约等于12.34的数.
这就是你爱不想让美分神秘的出现和消失的地方执行计算时应该使用decimal的原因,因为浮点数不精确,浮点数据类型在科学和工程应用方面很合适,但是在金融应用不好使.
相关文章推荐
- C#实现远程桌面自动登录
- 编写高质量代码改善C#程序的157个建议——建议52:及时释放资源
- 编写高质量代码改善C#程序的157个建议——建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源
- 编写高质量代码改善C#程序的157个建议——建议49:在Dispose模式中应提取一个受保护的虚方法
- C#基础系列——异步编程初探:async和await
- 编写高质量代码改善C#程序的157个建议——建议48:Dispose方法应允许被多次调用
- 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理
- AutoCAD.Net/C#.Net QQ群:193522571 将坐标系置为WCS
- 编写高质量代码改善C#程序的157个建议——建议46:显式释放资源需继承接口IDisposable
- C#枚举器接口IEnumerator的实现
- C#调Exe
- 利用Visual Studio寻找C#程序必要的运行库文件
- (转)C#生成中文汉字验证码源码(webform)
- C#名单:一个简单的实现
- C#制作、打包、签名、发布Activex全过程
- C#综合揭秘——细说多线程(下)
- C#综合揭秘——细说多线程(上)
- C#程序关闭时怎么关闭子线程
- C#生成随机验证码