Java为何要引入strictfp

strictfp是Java中的一个关键字,全称 strict float point (精确浮点),用于限制浮点计算并在执行浮点变量操作时确保每个平台上的结果相同。

浮点计算与平台有关,即在不同平台(16/32/64位处理器)上运行类文件时,可以实现不同的输出(浮点值)。为了解决这类问题,在JDK1.2版本中引入了strictfp关键字,遵循IEEE754标准进行浮点计算。(也许可能真的有人不知道IEEE754,那就建议自行了解咯~)

如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,推荐使用关键字strictfp。

strictfp与Java方法

strictfp与普通方法

下面代码的calMoney()被strictfp修饰了,那就表示这个方法会遵照strictfp的“要求”。

public class Coffee {   private double price;private double weight;public Coffee(double price, double weight) {this.price = price;this.weight = weight;}public strictfp double calMoney() {return price*weight;}//setters and getters}

strictfp与抽象方法

strictfp绝对不能用于抽象方法!!!会编译错误的!!!

public interface ICalculate {   strictfp double multiply();}

上面的代码就是使用了strictfp修饰接口中的抽象方法,编译错误!!!

strictfp与Java类

strictfp与普通类

当使用strictfp修饰符声明类时,那么在类中声明的所有方法以及在该类中声明的所有嵌套类型都隐式被strictfp修饰。

public strictfp class Coffee {   private double price;private double weight;public Coffee(double price, double weight) {this.price = price;this.weight = weight;}public double calMoney() {return price*weight;}//setters and getters}

如上代码,calMoney() 虽然没有直接被 strictfp 修饰,但由于Coffee这个类被 strictfp 修饰了,所以实际上 calMoney() 还是被strictfp修饰了。

strictfp与抽象类

strictfp 可以用于抽象类,在抽象类被继承,其中的抽象方法被实现的时候会默认使用 strictfp 修饰。

但是,前面说过,strictfp 不能用于抽象类中抽象方法的修饰,再次强调!!!

public abstract strictfp class AbstractCoffee {   private double price;public Coffee(double price) {this.price = price;}public abstract double calculate();//setters and getters}
public class Coffee extends AbstractCoffee {   private double weight;public Coffee(double price, double weight) {super(price);this.weight = weight;}public double calculate() {return getPrice()*weight;}//setters and getters}

strictfp与接口

strictfp 可以用于接口,在接口被实现,其中的抽象方法也被实现的时候会默认使用 strictfp 修饰。

但是,前面说过,strictfp 不能用于接口中抽象方法的修饰,再次强调!!!

public strictfp interface ICalculate {   double multiply();}

如上代码,multiply()虽然没有被(事实上也不能被)strictfp修饰,但下面的multiply()方法就默认了这一点:

public class Coffee implements ICalculate {   private double price;private double weight;public Coffee(double price, double weight) {this.price = price;this.weight = weight;}public double multiply() {return price*weight;}//setters and getters}

上面的Coffee类没有被strictfp修饰,multiply()方法也没有被strictfp修饰,但由于multiply()是从ICalculate接口继承过来的,所以默认带上了strictfp的修饰。

抽象类中,strictfp只是不能修饰抽象方法,普通方法不受限。但由于接口的方法是隐式抽象的,因此其实strictfp 不能用于接口内的任何方法!!!!

strictfp的功能测试

public class StrictfpTest {private static strictfp double add(float a, double b) {return a+b;}public static void main(String[] args) {System.out.println(0.6710339+0.04150553411984792);System.out.println(add(0.6710339f, 0.04150553411984792));}}

测试结果:

0.7125394341198479
0.7125394529774224

strictfp是高精的吗

答案是:No!!!绝对不是!!!

strictfp只是保证浮点运算都严格按照IEEE754进行,保证了各种平台下浮点运算规则的统一,并不是确保了高精。

比如3*0.1,如果我没记错的话,你就算使用strictfp也不能精确得到0.3,更何况高精运算。

高精运算如果能使用轮子的话就用java.math.BigDecimal吧!

【Java】关键词strictfp解析相关推荐

  1. 【Java】strictfp关键词解读

    文章目录 strictfp与Java strictfp与Java方法 strictfp与普通方法 strictfp与抽象方法 strictfp与Java类 strictfp与普通类 strictfp与 ...

  2. Java爬取解析去哪儿景点信息

    前言:这两周在做 Web 课的大作业,顺便琢磨了一下如何使用 Java 从网上获取一些数据,现在写这篇博客记录一下. PS:这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关!!! Java ...

  3. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  4. java中http解析url,java url 编码(解析http请求汉语言地址 )

    java url 编码(解析http请求中文地址 ) 在近在做项目的过程中,由于客户那边服务器上提供的有很多中文结构目录.请求要的地址不能正常运行显示出来.下面来分享一下我对http协议处理请求中文的 ...

  5. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  6. 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...

    在线演示  本地下载 如果你曾经开发过内容聚合类网站的话,使用程序动态整合来自不同页面或者网站内容的功能肯定对于你来说非常熟悉.通常使用java的话,我们都会使用到一些HTML的解析,例如,httpp ...

  7. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

最新文章

  1. MySQL 触发器应用案例
  2. 未来区块链技术将赋能多个领域促进全球经济发展
  3. 让思考成为一种习惯:一位软件工程专业学生的大学生涯规划
  4. python 输出当前行号
  5. LINUX系统配置相关
  6. 25岁房贷上万濒临失业,大专小哥转行软件测试“挽救”人生
  7. 华为荣耀 4x 刷机体验 直奔 Android 6.0
  8. 怎样做好一个项目经理
  9. android定位问题
  10. 芝麻二维码,安卓和苹果二维码合并和统计工具
  11. 易生活(二)-APP—安卓中评论功能的实现
  12. 听说你还不了解微前端?[收藏=学会]
  13. ubuntu 高级做图软件 krita
  14. 多暂估的库存如何调整_去年暂估的库存如何在今年做冲销
  15. 数据资产确权认责,确什么权,认什么责?
  16. Two Sawmills(锯木厂选址)
  17. 新锐房地产销售管理系统(部分流程)技术解析(十) 销售管理_销售优惠设置
  18. 计算机自动维护有用吗,电脑如何关闭自动维护功能?
  19. 适合初学者练手的vue小项目(附github源码)
  20. revit导出lumion插件_【BIM前沿】Revit与Lumion的强强联合

热门文章

  1. 为了IT人的荣耀,请大力支持《中国人的紧箍咒》!理由如下——
  2. 将某字符串切割成阵列并排序列出
  3. 计算机一级表格样式在哪儿,word表格样式在哪 word表格样式在哪里
  4. c#网页自动化脚本语言,c# – 创建用于创建网页的脚本语言
  5. ubuntupython损坏_修复损坏的Python3.2安装(Ubuntu)
  6. sql数据导入错误代码: 0x80004005_PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR...
  7. (硬 核)使用MySQL管理和查询数据 ( 入 门 须 知 ②)
  8. mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)
  9. ipv6地址为什么显示两个_【聚焦】IPv6进行时,别被这些因素绊住脚
  10. python django restful框架_python+django+rest框架配置创建方法