文章目录

  • strictfp与Java
  • strictfp与Java方法
    • strictfp与普通方法
    • strictfp与抽象方法
  • strictfp与Java类
    • strictfp与普通类
    • strictfp与抽象类
    • strictfp与接口
  • strictfp的测试代码

strictfp与Java

Java关键词strictfp是指"strict floating-point"(严格浮点),它用于确保浮点计算结果的可移植性,从Java2开始引入,现在已经废弃。

Java浮点运算在不同平台、不同编译器中会有微小的差异,即在不同平台(16/32/64位处理器)上运行类文件时,可能会出现不同的输出(浮点值)。这是因为硬件浮点单位在执行运算时使用的是不同的浮点计算方式,而这些浮点计算方式可能会导致结果的微小差异。在一些需要精确计算的场景,这种差异可能会产生重大影响,因此Java引入了strictfp关键词来避免这种问题。strictfp声明表达式严格遵循IEEE-754算术规范,限制浮点计算的精度和舍入,有助于跨平台特性的实现。

使用strictfp关键词声明类、接口、方法、变量后,就会强制执行严格的浮点运算,以确保在不同平台上的浮点计算结果的一致性。在这种情况下,Java虚拟机会忽略硬件浮点单位的计算方式,而采用一种特定的、固定的浮点计算方式。

strictfp无法保证高精度,真正的高精度浮点运算应该查看java.math.BigDecimal。

需要注意的是,使用strictfp关键词会对性能产生一定的影响,因为它需要使用一种特定的浮点计算方式来进行计算。因此,在一些对性能要求比较高的场景下,应该谨慎使用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

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

  1. java中strictfp关键字,java strictfp关键字用法大全详解

    一.strictfp关键字简介 strictfp是Java中提供的一个保留关键字,该关键字是从这第java JDK2版本儿开始出现的一直沿用到现在,只不过很多情况下都不怎么使用,所以容易被大家遗忘,因 ...

  2. java同步关键词解释、synchronized、线程锁(Lock)

    1.java同步关键词解释 21.1 synchronized synchronized是用来实现线程同步的!!! 加同步格式: synchronized( 需要一个任意的对象(锁) ){ 代码块中放 ...

  3. java实现关键词云_Java synchronized 关键词详细说明

    Java synchronized 关键词详细说明 外置专业技能点系统进程和进程的定义 进程建立方法 进程的情况情况变换 线程安全的定义 synchronized 关键词的几类使用方法装饰非静态数据组 ...

  4. 手把手教你java快速过滤关键词

    java过滤关键词 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常 ...

  5. 10大关键词解读中国互联网五年间创新飞跃在哪里

    20世纪50年代末,因特网的前身于美国诞生,70年代,互联网逐渐成型,并带动美国成为世界市场中心与创新中心.据雷锋网了解,相对应的,大洋彼岸的中国互联网事业,也经历了从无到有.自成一体.最近五年,据阿 ...

  6. 关于sqoop抽取数据时显示ERROR :/QueryResult.java‘ already exists 解读

    关于sqoop抽取数据时显示ERROR :/QueryResult.java' already exists 解读 报错日志 ERROR orm.CompilationManager: Could n ...

  7. 重磅报告 | 70页PPT、10大关键词解读中国互联网创新飞跃的五年

    过去5年,是中国互联网创新飞跃的五年,中国从具有先天人口优势的网络大国逐步迈向技术创新驱动的网络强国. 我国互联网产业在5年里究竟发生了哪些变化?阿里研究院发布报告<创新飞跃的五年:10大关键词 ...

  8. Java反射机制解读

    Java反射机制解读 1.什么是反射 2.Hello,Java反射 3.Java程序运行的三个阶段 4.反射相关类 5.反射的优化 6.反射Class类分析 7.获取Class对象的六种方式 8.类加 ...

  9. 区块链技术关键词解读:“区块”和“链”

    几个世纪以来,人类社会的商业行为主要依赖于三个方面:等价交换物.交易双方的信任和被证实的身份.简单地说:正在交换什么,谁在确认?商业领域的信任关系通常要依赖于正直.诚信的个人.中介机构或者其他组织才能 ...

最新文章

  1. 连麦互动直播方案全实践3:网易云信连麦互动的实现方案
  2. matlab将孤立点连接起来,复杂网络模型的matlab实现
  3. CF617E. XOR and Favorite Number
  4. JAVA基础学习大全(笔记)
  5. Python源码剖析(四)字符串对象
  6. linux救黑砖手机,手机黑砖9006/9008救砖教程 通用救砖模式详细流程
  7. 天翼云联手平凯星辰共建开源分布式数据库实验室
  8. mantis系统php版本,PHP_mantis安装、配置和使用中的问题小结,开发需要,安装mantis(Mantis Bug Tra - phpStudy...
  9. c语言的字符型都有什么作用是什么,字符型数据是什么意思怎么理解
  10. Universal Style Transfer via Feature Transforms (WCT,风格迁移,NIPS2017)
  11. 从论文中导出参考文献至EndNote
  12. logits and labels must be broadcastable: logits_size=[131072,9] labels_size=[131072,8]的错误
  13. hp服务器pe系统安装win7系统安装系统安装失败,使用硬盘安装系统出现pGptRestore部署失败怎么解决?...
  14. (十八)【模电】(放大电路中的反馈)交流负反馈对放大电路性能的影响
  15. 【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第3章 信息系统资源管理
  16. 高考填报志愿计算机操作技巧,2021高考填报志愿六个技巧
  17. 传统与深度学习图像分割算法
  18. linux 显卡扩展坞,Ubuntu18.04上外接显卡扩展坞安装Nvidia驱动和CUDA10.0及cuDNN
  19. 清华同方计算机配置,清华同方电脑如何bios设置|清华同方bios设置最佳方法
  20. Java实验报告一(完全数、一年四季、杨辉三角、path和classpath区别、next()和nextLine()区别)

热门文章

  1. 计算机应用能力考试怎么填,职称计算机应用能力考试网上报名表格怎么填写
  2. Vitis 软件平台版本说明
  3. matlabI 配置成vsCODE风格的暗色主题
  4. [cesium] 数字孪生 | 超图 | UE4 | Unity | 基于三维GIS + 游戏引擎结合示例 | UE4 和 Unity的效果展示
  5. 早产儿是什么原因造成的?这些事情宝妈要注意
  6. FFMPEG 摄像头 命令行参数 录像 直播 rtmp
  7. 最全GNSS 系统(GREJSCI)各个信号频率带宽一览表
  8. Android常见错误汇总
  9. 博客日常更新地址https://www.cnblogs.com/nuochengze
  10. Error connecting to master ‘slave@192.168.200.128:3307‘ - retry-time: 30 retries: 1