【问题标题】:Math parsing issues with double precision Java variables双精度 Java 变量的数学解析问题
【发布时间】:2014-01-09 00:04:38
【问题描述】:

我有一些繁重的数学需要翻译,从我最初用 VB6 开发的应用程序到 Java,即使是最基本的方程式也遇到了一些问题。

例如,为什么会这样,

double QD1=0;
QD1=24+c; QD1=QD1/513;

但这不起作用

double QD1=0;
QD1=(24+c)/513;

另外,我从一个完全线性的方程中得到了一些非线性,使用双精度数。我的系统是 2006 年左右制造的笔记本电脑上的 64 位 Fedora。这可能是处理器问题还是编码问题?使用 C++ 或某种解析器插件会更好吗?

【问题讨论】:

  • 对于数学繁重的应用程序,您可以选择编程语言,请访问Julia。过去为 Web 应用程序编写了很多数学代码,Java 不是我今天的选择。
  • (y) 谢谢你的建议。我会调查的。
  • 哇 - 刚刚浏览了那个描述 - 非常酷。 :D

标签: java parsing math


【解决方案1】:

应该是

double QD1=0;
QD1=(double)(24+c)/513;

您需要将整数 (24+c) 转换为 double 类型。

阅读更多相关信息here

【讨论】:

  • 谢谢 - 我需要在用括号分隔的每个段之前执行此操作吗?像(双)(x/y)+(双)(z/y)
  • 另一种方法是:QD1=(24d+c)/513; 如果你除整数(xyz 在你的情况下)你应该把它转换成双倍。如果xyz 具有 double 类型,则不应添加额外的转换。
  • 或者你可以把你的数字文字写成 24.0 和 513.0 所以它们是双打的,如果这是你的意图.... :)
  • @PaulAdamson 每当您将两个整数相除时,都会得到整数除法(这会丢弃任何余数)。如果xy 是整数,则(double)(x/y)xy 进行整数除法first,因为第二组()。然后它将得到的整数转换为double。但这仍然会丢弃其余部分。如果你想要一个小数结果,你需要((double)x/y) 或其他东西。这会将x 在除法之前转换为double,因此您将不会得到整数除法。
【解决方案2】:

有关此类问题的更完整解释,请参阅回复:What are the rules for evaluation order in Java?

【讨论】:

    【解决方案3】:

    这一次,直接回答:

    ...为什么会这样,

    double QD1=0;
    QD1=24+c; QD1=QD1/513;
    

    QD1 显然是 double。对于 Java,24 是一个整数常量。如果c 是整数类型,则使用整数运算将c 添加到24,并将结果转换为double,然后分配给QD1。如果c 是浮点类型,则将24 提升为double,添加到c,并将double 结果分配给QD1。无论哪种方式,QD1 的除法都是双倍除以整数常量。整数常量被提升为 double 并执行浮点除法,double 结果分配给QD1

    但事实并非如此。

    double QD1=0;
    QD1=(24+c)/513;
    

    在这种情况下,如果c 是整数类型,则右侧的整个表达式对整数进行运算并返回整数类型。在 Java 中,整数除法会截断使用浮点值和运算符执行除法时可能产生的任何小数部分。完成右侧的求值后,整数结果将提升为double,然后将其分配给QD1,但此时,预期结果的小数部分已经丢失。

    在实践中防止此特定问题的方法是始终为浮点计算中使用的所有整数常量提供小数部分。例如。更改两个示例中的代码以使用24.0513.0 作为常量。即使在按预期工作的代码中也总是这样做。如果不打算使用整数类型,未来的编辑可能会“破坏”实现。

    【讨论】:

    • 感谢您提供详尽的答复。我真的很感谢你的时间。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-10-21
    • 2010-11-27
    • 2012-02-09
    • 2012-01-10
    相关资源
    最近更新 更多