【问题标题】:Not getting exact value from float calculations in a java code [duplicate]没有从Java代码中的浮点计算中获得准确的值[重复]
【发布时间】:2020-12-12 12:57:08
【问题描述】:

基本上我正在改变布局比例。我必须将当前布局比例更改为另一个比例。我在我的应用程序中使用了一个代码 sn-p。

import java.util.*;
public class Big{


public static void main(String args[]){
float b=(new Scanner(System.in)).nextFloat();
float a=(b*((float)225/440));

//Another layout ratio height
System.out.println(a);

//Back to previous layout height
float c=(a*((float)440/225));
System.out.println(c);



}

}

以下是一些输入和他们尊重的输出:

在输入值 50,60.0,65 和 69.9999 上,代码分别返回相同的输出 50,60.0,65 和 69.9999。 但是当我尝试输入 70 和 80 时,代码分别返回近似值 69.99999 和 79.99999。 问题是 - 为什么在 70 和 80 的情况下我得到这些近似值而不是精确值。 可能还有其他一些情况。我正在尝试在所有情况下获得准确的值。

【问题讨论】:

  • 也请阅读article。将来,在发布新问题之前,请在此处和一般情况下更加努力地寻找答案。浮点数学在计算中的“破碎性”是一个常见的讨论话题。

标签: java android layout floating-point pixel-density


【解决方案1】:

使用 BigDecimal 进行精确计算,但要小心,因为它真的很慢。

正如上面的 cmets 所说,浮点型数学在设计上是不精确的:没有办法表示可以在实数集中创建的无穷大数

BigDecimal 可用于此类计算。但它以精确换取速度。

【讨论】:

  • BigDecimal 不会消除舍入问题。问题中的代码除以 440,除非分子中有 11 的因数,否则无法表示实数结果;除以 225,需要 9 的因数。
  • @ericpostpischil 我该如何解决?
  • @JoshiRaez 感谢我尝试但不起作用的方法。你能告诉我在哪里可以实现大十进制来解决这个问题吗?
  • @RupeshKumar 不要在 cmets 中提出新问题。 Stack Overflow 使用问答形式——这不是一个讨论论坛。发布一个新问题作为问题。如果你这样做,相信我,你会得到答案。
  • @RupeshKumar:你没有实现BigDecimal;你用吧。但是你不会用它来解决这个问题。目前尚不清楚您是否有问题。浮点算术的大多数用途都期望它产生不同于实数算术的结果,因为浮点算术被设计为仅近似实数算术。为什么需要准确的结果?您正在使用什么“布局”?输入一个包含有关实际问题的完整详细信息的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2011-12-24
  • 2023-04-10
  • 1970-01-01
  • 2022-01-22
  • 2012-12-10
相关资源
最近更新 更多