为什么在java中长时间使用不同的结果,而双精度使用相同的值
我的问题 1) 在第一组中,请说明为什么对相同的值给出不同的值为什么在java中长时间使用不同的结果,而双精度使用相同的值,java,floating-point,double,Java,Floating Point,Double,我的问题 1) 在第一组中,请说明为什么对相同的值给出不同的值3.45和3.4499998 2) 在第二组输出中,为什么输出不同于第一组输出 提前感谢…在第二组中,您错过了括号,它正在对System.out.println语句“Double sum”和“Float sum”中的字符串执行其他操作,因此请在算术表达式中添加括号以获得正确的结果 public static void main(String[] args) { double firstDouble = 1.8d;
3.45
和3.4499998
2) 在第二组输出中,为什么输出不同于第一组输出
提前感谢…在第二组中,您错过了括号,它正在对
System.out.println
语句“Double sum”和“Float sum”中的字符串执行其他操作,因此请在算术表达式中添加括号以获得正确的结果
public static void main(String[] args) {
double firstDouble = 1.8d;
double secondDouble = 1.65d;
float firstFloat = 1.8f;
float secondFloat = 1.65f;
System.out.println("DOUBLE SUM : "+(firstDouble + secondDouble));
System.out.println("FLOAT SUM :"+(firstFloat + secondFloat));
System.out.println("DOUBLE SUM"+firstDouble + secondDouble);
System.out.println("FLOAT SUM"+firstFloat + secondFloat);
}
OUT PUT:
DOUBLE SUM : 3.45
FLOAT SUM :3.4499998
DOUBLE SUM :1.81.65
FLOAT SUM :1.81.65
这给
System.out.println("DOUBLE SUM : "+(firstDouble + secondDouble));
System.out.println("FLOAT SUM :"+(firstFloat + secondFloat));
System.out.println("DOUBLE SUM"+ (firstDouble + secondDouble));
System.out.println("FLOAT SUM"+(firstFloat + secondFloat));
1) 因为float不够精确,无法计算精度高于(3.45-3.4499998)=2E-7的和
2) “DOUBLE SUM”+firstDouble
将firstDouble转换为字符串并将其串联,然后将其串联到secondDouble。put()时,它首先计算和,并将结果连接到“DOUBLE sum”System.out.println(“DOUBLE sum”+firstDouble+secondDouble)代码>
此处参数作为字符串
。加号/加法运算符用作字符串连接。括号具有更高的优先级,以便先求值
第一个问题已经回答了 这非常有用:
对于一个简短的答案,请尝试在处理浮点时使用
DOUBLE SUM 3.45
FLOAT SUM 3.4499998
DOUBLE SUM 3.45
FLOAT SUM 3.4499998
我知道。所以发生了什么。当我去掉括号时,对我来说,它只给出了这样的串联双SUM1.81.65浮点SUM1.81.65
@PSR,没有括号,它被解释为(“双和”+firstDouble)+secondDouble“
,这是两个字符串串联,根本没有浮点加法。要理解@Shubhrajyoti的答案,您应该了解运算符优先级。您可以在此处快速查看:1)1.8d!=1.8f和1.65d!=1.65f如果有相同的,则不需要不同的放置af
和d
2)括号的优先级会发生变化,因为您评估事物的顺序很重要。如果短小数点特别重要,例如在金融交易中,BigDecimal是一种很好的数据类型。它在其他情况下没有特别的优点,比如科学计算,在科学计算中,10并不特别,而且通常不如双倍计算的效率和方便。
BigDecimal a = new BigDecimal("1.8");
BigDecimal b = new BigDecimal("1.65");
BigDecimal c = a.add(b); // returns a BigDecimal representing exactly 3.45