博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浮点类型的特殊性知多少
阅读量:5340 次
发布时间:2019-06-15

本文共 971 字,大约阅读时间需要 3 分钟。

浮点类型float和double有一些特殊性,比如他们处理精度的方式,在比较两个值是否相等时,浮点类型的不准确性可能会造成非常严重的后果。有时候本来应该是相等值,最后一比较却别的不想等了。

一次很简单的赋值可能就会将引发精度问题,比如double number=140.6F。由于double能容纳的比float更加精确的值,所以C#编译器实际上会将这个表达式解释成double number=140.600 0061 0351 6。而这个值作为一个float确实是140.6,但表示成一个double的时候,并不能准确度地等于140.6

 

 
static 
void TestMethod1()
        {
            
decimal decimalnumber = 
4.2M;
            
double doubleNumber1 = 
0.1F * 42F;
            
double doubleNumber2 = 
0.1D * 42D;
            
double floatNumbler = 
0.1F * 42F;
            Trace.Assert(decimalnumber !=(
decimal)doubleNumber1);
            Trace.Assert((
double)decimalnumber != doubleNumber1);
            Trace.Assert((
float)decimalnumber != floatNumbler);
            Trace.Assert(
4.2F != 
4.2D);
        }

 为了避免浮点类型的不准确性而造成的非预期的结果,开发者应该避免使用这些类型来构建相等性条件。相反,相等性条件应该包含一个容差,为此,一个简单的办法就是用一个值减去另一个值,然后计算结果的绝对值是否小于最大容差。另外,更好的方案是使用decimal类型,而不是浮点类型。

另外,浮点类型还有其他的一些特殊性质,例如,一个整数除以零理论上应该是错误的。这对于精确类型的Int,decimal这一点都是成立的。然而对于浮点类型float和double允许一些特殊值,例如:

float f=0f;

System.Console.Write(f/0);

转载于:https://www.cnblogs.com/shineqiujuan/archive/2012/06/03/2532421.html

你可能感兴趣的文章
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
struts2入门之准备工作
查看>>
从C语言的弱类型属性说起
查看>>
大牛博客
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>
Docker 安装MySQL5.7(三)
查看>>
python 模块 来了 (调包侠 修炼手册一)
查看>>
关于CSS的使用方式
查看>>
本地MongoDB服务开启与连接本地以及远程服务器MongoDB服务
查看>>
跨域解决方案之CORS
查看>>
学习RESTFul架构
查看>>
分析语句执行步骤并对排出耗时比较多的语句
查看>>
原生JS轮播-各种效果的极简实现
查看>>
软件工程总结作业---提问回顾与个人总结
查看>>
计数器方法使用?
查看>>
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
查看>>
sonar结合jenkins
查看>>