Java 为什么anyValue%1是“1”;“愚蠢的数学”;在声纳中,什么值是双精度的?
SonarQube在我的代码中提出了重大违规行为。描述说 某些数学运算很愚蠢,不应该执行 因为他们的结果是可以预测的 特别是,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
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界面中将问题标记为假阳性。