我有一个使用Java 8和Double作为数据类型的复杂数据处理算法。给定相同的输入(几十万个数据库行),该算法输出不同的双值。有时返回value a,有时值b。这两个值在每次执行时交替进行。a与b的差值为0.0001。我知道双数据类型不会像Decimal那样授予确切的值。但是,我不确定它是否提供了可重复的结果,假设输入完全相同。也就是说,是否有可能以不一致的方式应用四舍五入的政策?我在这里的目的是解释为什么用相同的输入得到不同的值。
其他细节:我正在使用Tomcat 8运行时环境,在SAP上完成部署。数据库级别的数据类型是十进制的,由于历史原因,我们需要在Java级别加倍。
发布于 2017-02-23 22:58:52
秩序很重要。如果每次处理的数据库行的顺序不一样,则会产生不同的结果。下面是一个简单的例子:
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d1 + d2 + d2);
System.out.println(d1 + d2 + d2 + d1); 发布于 2017-02-23 22:57:30
给定相同的输入,浮点数计算(在同一个平台上)将产生相同的输出。
但是,如果以不同的顺序输入输入数字,则可能得到不同的结果(尽管这在数学上不会产生任何差别)。也许这就是这里所发生的事情(看到您从关系数据库中提取数字,除非显式排序,否则关系数据库没有定义的顺序)。如果您使用多个CPU进行并行计算,并且每次对数据进行不同的划分和组合,也会发生同样的情况。
发布于 2017-02-23 23:02:17
对于strictfp,Java语言规范完全定义了所有简单算法的结果,无论是在哪个平台上。
有些java.lang.Math方法可以为某些操作产生稍微不同的结果。如果您需要可重复的结果,请使用java.lang.StrictMath代替。
正如在下面的注释中所指出的,java.lang.Math.cos是一个函数的示例,其结果可以更改。API文档说:“计算结果必须在精确结果的1 ulp以内,结果必须是半单调的。”
https://stackoverflow.com/questions/42427719
复制相似问题