java中什么是严格的浮点计算?请解释下,谢谢。 40
3个回答
展开全部
严格浮点计算,即java中设有strictfp关键字参与的浮点运算。
strictfp: strict floating point.
通常处理器都各自实现浮点运算,各自专业浮点处理器为实现最高速,计算结果会和IEEE标准有细小差别。比如intel主流芯片的浮点运算,内部是80bit高精运算,只输出64bit的结果。IEEE只要求64bit精度的计算,你更精确反而导致结果不一样。
所以设立‘严格浮点计算strictfp’,保证在各平台间结果一致,IEEE标准优先,性能其次;
而非严格的浮点计算是“性能优先”,标准其次。
通常不是高精密计算,非严格就很好用了。
strictfp: strict floating point.
通常处理器都各自实现浮点运算,各自专业浮点处理器为实现最高速,计算结果会和IEEE标准有细小差别。比如intel主流芯片的浮点运算,内部是80bit高精运算,只输出64bit的结果。IEEE只要求64bit精度的计算,你更精确反而导致结果不一样。
所以设立‘严格浮点计算strictfp’,保证在各平台间结果一致,IEEE标准优先,性能其次;
而非严格的浮点计算是“性能优先”,标准其次。
通常不是高精密计算,非严格就很好用了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
System.out.println(255555555f - 255555554f);
System.out.println(25555555f - 25555554f);
System.out.println(1.7 - 1.6);
可以试下上面这两个输出的结果,还有很多类似的,随便多试几个就会发现这样的问题。其实不止是JAVA很多的编程语言中都存在这样的问题。这是计算机对浮点运算的机制决定的。
这样的结果如果是在银行或者其他商业计算中出现那么结果是不能想像的。所以有严格的浮点计算。JAVA对这样的计算是封装在BigDecimal类中的。下面这个例子你可以看看:
import java.math.BigDecimal;
public class TTT {
public static void main(String[] args) {
System.out.println(255555555f - 255555554f);
System.out.println(25555555f - 25555554f);
System.out.println(1.7 - 1.6);
BigDecimal a = new BigDecimal("255555555");
BigDecimal b = new BigDecimal("255555554");
System.out.println(a.subtract(b));
a = new BigDecimal("25555555");
b = new BigDecimal("25555554");
System.out.println(a.subtract(b));
a = new BigDecimal("1.7");
b = new BigDecimal("1.6");
System.out.println(a.subtract(b));
}
}
对于上面的代码BigDecimal的对象必须由String类型的参数去构造。因为这样是预见的结果。如果直接用double去构造,可能会造成一些不可预见的结果。详细可去看BigDecimal的API。
System.out.println(25555555f - 25555554f);
System.out.println(1.7 - 1.6);
可以试下上面这两个输出的结果,还有很多类似的,随便多试几个就会发现这样的问题。其实不止是JAVA很多的编程语言中都存在这样的问题。这是计算机对浮点运算的机制决定的。
这样的结果如果是在银行或者其他商业计算中出现那么结果是不能想像的。所以有严格的浮点计算。JAVA对这样的计算是封装在BigDecimal类中的。下面这个例子你可以看看:
import java.math.BigDecimal;
public class TTT {
public static void main(String[] args) {
System.out.println(255555555f - 255555554f);
System.out.println(25555555f - 25555554f);
System.out.println(1.7 - 1.6);
BigDecimal a = new BigDecimal("255555555");
BigDecimal b = new BigDecimal("255555554");
System.out.println(a.subtract(b));
a = new BigDecimal("25555555");
b = new BigDecimal("25555554");
System.out.println(a.subtract(b));
a = new BigDecimal("1.7");
b = new BigDecimal("1.6");
System.out.println(a.subtract(b));
}
}
对于上面的代码BigDecimal的对象必须由String类型的参数去构造。因为这样是预见的结果。如果直接用double去构造,可能会造成一些不可预见的结果。详细可去看BigDecimal的API。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
所有的小数都要保留。一般用BigDecimal比较好
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询