我正在尝试将一些AS400/RPG代码转换为Java.
我能够在网上找到一个示例,该示例反映了我在代码中看到的内容:
d elevensix s 11 6 inz(26285.88991)
d seventwo s 7 2
c eval(h) seventwo = elevensix
c eval *inlr = *on
Run Code Online (Sandbox Code Playgroud)
我已经编写了代码,Java我发现我在RPG代码中看到的舍入结果与我在Java. 这是我正在做的舍入示例Java:
private Long roundAmount(Double amount) {
return Math.round(amount);
}
Run Code Online (Sandbox Code Playgroud)
在实践中,我的代码生成的结果与代码的结果相匹配,RPG但是我发现了逻辑不一致的示例;有些按预期四舍五入,而另一些则没有。
我曾大量使用 Java;这是我第一次涉足RPG。老实说,我什至不确定从哪里开始。例如,在RPG上面的代码中;它究竟是如何工作的?我看到操作的结果被放入一个标有 2 个小数位的变量中;四舍五入是隐含的吗?在线搜索我发现以下关于 Java 如何处理舍入的定义:
Java 中的 Math.round() 方法用于将数字四舍五入到它的? 最接近的整数。这是通过将 1/2 加到数字上,取结果的下限,并将结果转换为整数数据类型来完成的。
老实说,这是清晰而简洁的。我还没有找到关于它如何工作的类似解释RPG;需要明确的是,这是在使用 的 AS400 …
假设性能不是问题,并且知道我只需要使用一类,因为我有我的程序所有的数字,这类型将是一个正确使用?我认为这BigDecimal可能是最好的选择,但我不确定.
在某些情况下,我需要在Java中进行非常精确的计算,但它总是会出现一些意外错误.如何避免它们或将错误保持在可接受的范围内?
例如
public static void main(String[] args) throws Exception {
double x = 0.0;
while (x <= 1.0){
System.out.println(x);
x += 0.1;
System.out.println("add 0.1");
}
}
- the result will be
0.0 add 0.1
0.1 add 0.1
0.2 add 0.1
0.30000000000000004 add 0.1
0.4 add 0.1
0.5 add 0.1
0.6 add 0.1
0.7 add 0.1
0.7999999999999999 add 0.1
0.8999999999999999 add 0.1
0.9999999999999999 add 0.1
Run Code Online (Sandbox Code Playgroud)
这不是预期的.
提前致谢
如何将BigDecimal转换为float,在Java中为2个小数?
BigDecimal x=new BigDecimal(any exponential term);
Run Code Online (Sandbox Code Playgroud)
现在,我想转换为仅具有2个小数点的浮点数,例如-0.45。
说我有很多数字.我知道在C中我们可以声明:
long long int // What is equivalent of this in Java?
long double // and this?
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想要求更多澄清.这是我的示例程序
double diff = 7.500 - 7.500;
System.out.println(diff); // result 0.0
if (diff > 0) {
System.out.println("+" + diff ); //result +0.0
} else {
System.out.println("-" + diff ); //result -0.0
}
Run Code Online (Sandbox Code Playgroud)
我的结果是-0.0.我的期望是0 == 0.0然后跳过if else条件.但它进入了其他条件.双倍0.0是大于还是小于0?
我使用的是HALF_UP舍入模式DecimalFormat的,我有地方工作不正常的escenery,我不知道为什么.
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
float tmp = (float) (0.5 * 1.05);
df.format(tmp);
float mul = Float.parseFloat(df.format(tmp));
Run Code Online (Sandbox Code Playgroud)
该mul变量的值,我希望有0.53值,我收到0.52值.
我正在使用Java 1.8.0_131.
已解决的最终法规
BigDecimal mul = new BigDecimal(0.5).multiply(new igDecimal(1.05));
mul = mul.setScale(2, RoundingMode.HALF_UP);
System.out.println(mul);
Run Code Online (Sandbox Code Playgroud) 我在遗留软件中找到了一些代码,我有兴趣知道哪个提供了更好的精度,因为它目前是采用双精度并对其进行计算的地方:
double doubleNum = (Math.round(55.88d * 100) - Math.round(2.33d * 100));
Run Code Online (Sandbox Code Playgroud)
第二个选择
BigDecimal bnv = BigDecimal.valueOf(55.88);
BigDecimal bsv = BigDecimal.valueOf(2.33);
System.out.println(bnv.subtract(bsv).setScale(2));
Run Code Online (Sandbox Code Playgroud)
两者产生相同的输出,我的理解是使用 bigdecimal 确保更精确。但是将 double 转换为 BigDecimal 时可能会出现损失
此外,第一个选项在铸造时可能会造成损失。
我总是使用 BigDecimal,但在这种情况下。
java ×8
bigdecimal ×3
types ×2
biginteger ×1
bits ×1
c ×1
double ×1
ibm-midrange ×1
java-8 ×1
numbers ×1
rounding ×1
rpg ×1