我有一些繁重的数学翻译,从我最初在VB6中开发的应用程序转换为Java,并且即使是最基本的方程式也遇到了一些问题。
例如,为什么这样做,
double QD1=0;
QD1=24+c; QD1=QD1/513;
但这不起作用
double QD1=0;
QD1=(24+c)/513;
另外,我使用双精度从一个完全线性的方程式中得到一些非线性。我的系统是在2006年左右建立的笔记本电脑上的64位Fedora。这可能是处理器问题还是编码问题?我会更好地使用C ++或某种解析器插件吗?
答案 0 :(得分:2)
答案 1 :(得分:0)
有关此类问题的更完整说明,请参阅以下答案:What are the rules for evaluation order in Java?
答案 2 :(得分:0)
这次,直接回答:
...为什么这样做,
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,并且使用分配给QD1
的双重结果执行浮点除法。
但事实并非如此。
double QD1=0;
QD1=(24+c)/513;
在这种情况下,如果c
是整数类型,则右侧的整个表达式对整数进行操作并返回整数类型。在Java中,整数除法会截断在使用浮点值和运算符执行除法时可能导致的任何小数部分。一旦右侧的评估完成,整数结果将被提升为double
,然后将其分配给QD1
,但到那时,预期结果的小数部分已经丢失。
在实践中防止此特定问题的方法是始终为浮点计算中使用的所有整数常量提供小数部分。例如。更改两个示例中的代码,以使用24.0
和513.0
作为常量。即使在按预期工作的代码中也要始终这样做。当不希望整数类型时,未来的编辑可能会“破坏”实现。