当前位置: 首页 > 知识库问答 >
问题:

为什么我会得到不同的答案以不同的顺序乘以三个双倍值?[副本]

柳修平
2023-03-14

我正在java中执行以下代码,但对于数学上应该是相同的数字,我得到了两个不同的答案。

public class TestClass {

    public static void main(String[] args) {
        
        double a=0.01;
        double b=4.5;
        double c=789;       
        System.out.println("Value1---->"+(a*b*c));
        System.out.println("Value2---->"+(b*c*a));      
    }
}

输出:

Value1---->35.504999999999995
Value2---->35.505

共有3个答案

潘嘉颖
2023-03-14

这是因为double类型是一种近似值。Java中的Double表示IEEE 754标准类型小数64。要解决这个问题,请使用数学。round()或BigDecimal类。

何志业
2023-03-14

本质上,Java使用二进制浮点值来处理所有基于十进制的操作。如前所述,在另一个答案中,这里有一个指向IEEE 754的链接,可以解决您遇到的问题。正如Joshua Bloch的《有效Java》中所述,请参阅第48项“如果需要准确答案,请避免浮动和双重”:

总之,对于任何需要精确答案的计算,不要使用float或double。如果希望系统跟踪小数点,并且不介意不使用基元类型带来的不便和成本,请使用BigDecimal。

毛越
2023-03-14

浮点数有一定的精度。有些分数不能用浮点数正确显示,这就是为什么会出现舍入错误的原因。

由于计算的优先级不同,结果也不同。每个计算都由两个乘法组成。Java中的multiply操作符具有从左到右的关联性。这意味着在(a*b*c)中,首先计算a*b,然后与((a*b)*c)相乘。其中一个计算链碰巧会产生舍入错误,因为其中的数字不能表示为浮点数。

 类似资料:
  • 我在这里创建了两个函数,它们几乎100%相同。唯一的区别是函数的regex字符集的顺序不同。为什么这两个函数会产生不同的输出?

  • 问题内容: 为什么需要添加“ L”字母以获得正确的长值?还有什么其他价值呢? 问题答案: 你的第一个值实际上是一个long(因为是,并且是,所以带值的值的结果就是一个long值。 但是第二个值是一个整数(因为你仅将一个值与一个值混用。所以结果将是一个整数。现在,所获得的结果超出了整数的实际范围。因此,在分配给该变量之前,被截断以适合有效的整数范围。 查看以下打印语句: 当你运行上面的代码时: 输出

  • 为什么结果是: =NaN =无穷大 我知道或除法有一点不同。我对得到的NaN非常满意,因为当某物除以零时,结果并不是定义的。但是为什么他们定义大于零除以零的结果是不独立呢?这和他们用来执行浮点除法的方法有关系吗?

  • 我们使用props来定下我们显示的顺序. 我们的组件基于我们排好序的props进行渲染. class PageSections extends Component { render() { const pageItems = this.props.contentOrder.map( (content) => { const renderFunc = this

  • 问题内容: 首先,我的Java版本: 输出为: 31 -117 8 0 0 0 0 0 0 -53 72 -51 -55 -55 47 -49 47 -54 73 1 0 -83 32 -21 -7 10 0 0 0 然后是Go版本: 输出: 31 139 8 0 0 9 110 136 0 255 202 72 205 201 201 47 207 47 202 73 1 0 0 0 255 2

  • 这是我的代码。它正在传递问题语句中给出的测试用例。问题链接:http://www.spoj.com/problems/ACPC10D/tri[i][j]存储从tri[0][1]到达索引(i, j)的最小值。