float compare

Abstract

使用float数据进行精确计算和比较,可能由于精度问题导致程序逻辑异常。

Explanation

使用float数据进行比较,计算机表达double和float型数据其实是个近似值,而不是精确值,直接用
它们进行比较判断,得到的结果可能与预期完全不同,导致程序逻辑异常。最严重的情况是进行相等
性比较"=="和"!=",极易错误;其次是">=""<="等比较判断,也比较容易出错。
示例1 double型数据进行判断。
public static double integral(MyFunction f, double x1, double x2) {
  double x = x1;
  double result = 0;
  double step = (x2 - x1) / 700;
  while (x != x2) {
    // 可以改为 (x ﹤= x2)
    result = result + f.valueFor(x) * step;
    x = x + step;
  }
  return result;
}
上述代码可能导致无限的循环,因为由于计算的误差,x!=x2,可能永远是成立的。
 
示例2 double型数据进行判断。
public static final double MAX_MONEY=0.2;
public string test(double d1,double d2){
  double d3=d1+d2;//
  if(d3<=MAX_MONEY){
    return "OK";
  }
}
上述代码,当d1=d2=0.1时,d3=0.20000000149011612是>0.2的,程序员想当然以为d3<=MAX_MONEY是
成立的,进行了错误的处理逻辑。
 

Recommendation(解决办法)

1、进行大于或等于、小于或等于,或小于某值的不同绝对值的检查,例如 Math.abs(x1-x2) ﹤MIN_DIFF;
bool float_equals(float a,float b){
  if (abs(a-b)<=1e-6)
    return true;
  return false;
}
2、根据场景可以考虑采用整数类型或用于精确表达小数的BigDecimal类型替代。

使用float进行比较问题处理的更多相关文章

  1. js实现省市区联动

    先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...

  2. CSS float 浮动属性

    本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...

  3. 在树莓派Raspbian下安装支持Hard Float的.NET环境

    [题外话] 最近入了个树莓派玩,系统装的官方推荐的Hard Float的Raspbian,由于衍生自Debian,所以Mono什么的非常好装.但是官方源中的Mono在Hard Float的Raspbi ...

  4. 对CSS中的Position、Float属性的一些深入探讨

    对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不 ...

  5. CSS float 定位和缩放问题

    今天调试一个看起来很简单的前端问题,但却花了太多的时间,示例代码: <!DOCTYPE html> <html> <head> <title></ ...

  6. chrome中不可见字符引发的float问题

    起因是刷知乎时碰到这么个问题:https://www.zhihu.com/question/41400503 问题代码如下: <!DOCTYPE html> <html lang=& ...

  7. c# float显示时保存一位小数

    UI显示时候,需求保留一位小数 //保留一位小数 参考: http://blog.sina.com.cn/s/blog_620531730100kfz6.html float ff = 1.01f; ...

  8. 前端之float的几种清除浮动方式

    前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.float清除方式1 <!DOCTYPE ...

  9. 格式化 float 类型,保留小数点后1位

    """  练习 :   小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,   并用字符串格式化显示出'xx.x%',只保留小数点后1位: &qu ...

  10. CSS清除浮动float方法总结

    使用浮动造成的BUG: 使用浮动前:(子节点是将父节点撑开了) 代码如下 <div class="box"> <div class="d1"& ...

随机推荐

  1. VSCode STM32跨平台开发环境搭建

    VSCode的强大不用多说了,直接上教程: 一.到官网下载安装VSCode 二.安装完成后,打开VSCode,安装PlatformIO IDE 插件 三.安装完重启VSCode,VSCode会继续安装 ...

  2. 创建一个简单的signalr项目

    1:新建一个empty的MVC项目 2:如果没有安装过signalr过那么要通过Nuget安装signalr 3:新建一个controller 然后建一个view =>index 4:新建一个s ...

  3. sqlserver将查询中一行内容转化为多行内容

    WITH CTE AS( SELECT top 5 TaskID ,Attachments from [V_AllAccessoriesAompression])SELECT a.TaskID,c.A ...

  4. Python基础数据类型-Number(数字)

    a = -1 # int b = 2.0 # float c = 13.11 # float d = 3.14j # complex print(type(a), type(b), type(c), ...

  5. Date 对象 定时器

    日期对象 Date 概述:date是表示日期时间的对象,主要的方法是获取时间和设置日期时间. date声明 使用new Date声明 有4种方式 1.不设参数 是获取当前的本地时间 var date ...

  6. 反序列化 sqlserver 中的 sysdiagrams,找到其中包含的表的信息

    转载于:Script SQL Server 2005 diagrams to a file - CodeProject /** <summary> Based on ufn_Varbina ...

  7. 人森第一个iOS app,写给我家baby的!纪念一下

    用python写的,对于非专业iOS开发来说,py是个不错的选择,使用beeware框架,感觉和写前端差不多

  8. PTA1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复 ...

  9. web后端之过滤器

    1直接java搞定 2把@WebFilter()去掉,配置web.xml文件.

  10. P2212 Watering the Fields S

    题目描述 给定n个点,第i个点的坐标为(xi,yi)(xi​,yi​),如果想连通第i个点与第j个点,需要耗费的代价为两点的距离.第i个点与第j个点之间的距离使用欧几里得距离进行计算,即:(xi-xj ...