Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么anyValue%1是“1”;“愚蠢的数学”;在声纳中,什么值是双精度的?_Java_Sonarqube_Modulus - Fatal编程技术网

Java 为什么anyValue%1是“1”;“愚蠢的数学”;在声纳中,什么值是双精度的?

Java 为什么anyValue%1是“1”;“愚蠢的数学”;在声纳中,什么值是双精度的?,java,sonarqube,modulus,Java,Sonarqube,Modulus,SonarQube在我的代码中提出了重大违规行为。描述说 某些数学运算很愚蠢,不应该执行 因为他们的结果是可以预测的 特别是,anyValue%1是愚蠢的,因为它总是返回0 但是,在我的例子中,anyValue是一个双精度值。这对我很有用。以下是实际代码: double v = Double.parseDouble(Utils.formatDouble(Double.valueOf(value.getValue()), accuracy.intValue())); boolean negativ

SonarQube在我的代码中提出了重大违规行为。描述说

某些数学运算很愚蠢,不应该执行 因为他们的结果是可以预测的

特别是,
anyValue
%1是愚蠢的,因为它总是返回0

但是,在我的例子中,
anyValue
是一个双精度值。这对我很有用。以下是实际代码:

double v = Double.parseDouble(Utils.formatDouble(Double.valueOf(value.getValue()), accuracy.intValue()));
boolean negative = v < 0;
v = Math.abs(v);
long deg = (long) Math.floor(v);

v = (v % 1) * 60;
double v=double.parseDouble(Utils.formatDouble(double.valueOf(value.getValue()),accurity.intValue());
布尔负=v<0;
v=数学abs(v);
长度=(长)数学楼层(v);
v=(v%1)*60;

分析仪是否假设我的变量为
int
(这是他们的错误)?还是我遗漏了什么?

您可以将表达式更改为使用显式双常量,使其更显式,如:

(v % 1.0d) * 60

这确实是一个bug,非常感谢您的报告

问题出现在代码中:

其中绝对不检查%运算符的左操作数的类型


我刚刚提交了以下bug来处理这个问题:

听起来像是他们这边的bug。为了完成起见,你能显示出你违规的确切代码吗?@pabrams为什么不能?@pabrams-你遗漏了一些东西。去试试看。或者阅读我链接到的规范。@user3659052否!他们所指的是,对于任何整数,
integer%1
运算都是无用的,因为它总是返回0,而对于浮点数,结果不是常数。对于没有得到它的人:
7.4%1
0.4
。嗯,它是
0.40000000000000036
,但那是因为
double
不一定是一个精确的数字。
1.0
1d
<代码>1.0d似乎无关。你是对的。双精度是默认值,可以省略。因此,
0
。这是一个好主意。我已经确认它消除了违规行为,并且更加明确。我仍然会向开发人员提出这个问题。最后,这只是欺骗工具的一种方式,我不会修改我的代码来关闭(错误的)违规。您可以在SonarQube界面中将问题标记为假阳性。