【Java】关键词strictfp解析
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.7125394529774224strictfp是高精的嗎
答案是:No!!!絕對不是!!!
strictfp只是保證浮點運算都嚴格按照IEEE754進行,保證了各種平臺下浮點運算規則的統一,并不是確保了高精。
比如3*0.1,如果我沒記錯的話,你就算使用strictfp也不能精確得到0.3,更何況高精運算。
高精運算如果能使用輪子的話就用java.math.BigDecimal吧!
總結
以上是生活随笔為你收集整理的【Java】关键词strictfp解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笨小猴(洛谷P1125题题解,Java语
- 下一篇: 【数据结构与算法】非森林版并查集V2.1