java 处理Float和Double时要小心陷阱
2018-02-26 11:22
211 查看
Float和Double包括float和double,有
和
与NaN进行比较,结果都是false。
所以尽量把“targeted执行的语句”放在确定的判断中,并且该判断返回true(因为NaN参与的判断一律返回false)
而下面的代码因为没有考虑monthly_salary等于NaN的情况,而不正确:
参考:
http://blog.csdn.net/jierui001/article/details/3278382
除此以外,在对浮点型进行处理时,可以参照Princeton的代码:
以及
参考:
https://algs4.cs.princeton.edu/12oop/
NEGATIVE_INFINITY -0.0 0 0.0 POSITIVE_INFINITY
和
NaN
与NaN进行比较,结果都是false。
所以尽量把“targeted执行的语句”放在确定的判断中,并且该判断返回true(因为NaN参与的判断一律返回false)
public employee(float monthly_salary) { if (monthly_salary >= 0.0) { this.yearly_salary = 12.0 * monthly_salary; // targeted执行的语句 } else throw IllegalArgumentException("illegal monthly salary"); }
而下面的代码因为没有考虑monthly_salary等于NaN的情况,而不正确:
public employee(float monthly_salary) { if (monthly_salary < 0.0) throw IllegalArgumentException("illegal monthly salary"); this.yearly_salary = 12.0 * monthly_salary; // targeted执行的语句在外面 }
参考:
http://blog.csdn.net/jierui001/article/details/3278382
除此以外,在对浮点型进行处理时,可以参照Princeton的代码:
public Point2D(double x, double y) { if (Double.isInfinite(x) || Double.isInfinite(y)) throw new IllegalArgumentException("Coordinates must be finite"); if (Double.isNaN(x) || Double.isNaN(y)) throw new IllegalArgumentException("Coordinates cannot be NaN"); if (x == 0.0) this.x = 0.0; // convert -0.0 to +0.0 else this.x = x; if (y == 0.0) this.y = 0.0; // convert -0.0 to +0.0 else this.y = y; }
以及
public Interval1D(double min, double max) { if (Double.isInfinite(min) || Double.isInfinite(max)) throw new IllegalArgumentException("Endpoints must be finite"); if (Double.isNaN(min) || Double.isNaN(max)) throw new IllegalArgumentException("Endpoints cannot be NaN"); // convert -0.0 to +0.0 if (min == 0.0) min = 0.0; if (max == 0.0) max = 0.0; if (min <= max) { this.min = min; this.max = max; } else throw new IllegalArgumentException("Illegal interval"); }
参考:
https://algs4.cs.princeton.edu/12oop/
相关文章推荐
- Java精确计算,用BigDecimal来处理int、double、float等之间的计算
- java中float,double类型运算的处理
- [JAVA] float,double大数据不要科学计数方法显示
- java中double和float精度丢失问题及解决方法
- java中float和double的区别
- java浮点类型float精度与Double精度范围实例使用说明
- Java中float和double类型的数据在内存中是怎样存放的
- Java中如何解决double和float精度不准的问题
- JAVA_int类型数据精度高于float低于double
- Java中浮点型数据Float和Double进行精确计算的问题
- (JAVA & C)数据类型取值范围——short int long float double等
- java实现表达式求值(算符优先算法,可计算int,double,float 形数据)
- java中short、int、long、float、double取值范围
- java float、double精度研究(转)
- Java 进阶6 异常处理的陷阱
- Java:Effective Java 学习笔记(第48条:如果需要精确的答案,请避免使用float和double)
- java中float/double计算丢失精度解决方案
- Java之浮点四则运算工具类-(double/float转化为BigDecimal)
- java处理double类型末尾的0
- java中int,float,long,double取值范围,内存泄露