Java与JavaScript对同一等式给出了不同的结果&;输入值

Java与JavaScript对同一等式给出了不同的结果&;输入值,java,javascript,Java,Javascript,以下等式和值使用Java/Javscript提供不同的网络输出: Javascript: var dayOfWeek = parseInt((dayOfMonth + 26 * (monthOfYear +1) / 10 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7); 爪哇: int dayOfWeek = (dayOfMonth + 26 * (monthOfYear +1) / 10 + year

以下等式和值使用Java/Javscript提供不同的网络输出: Javascript:

var dayOfWeek = parseInt((dayOfMonth + 26 * (monthOfYear +1) / 10 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7);
爪哇:

int dayOfWeek = (dayOfMonth + 26 * (monthOfYear +1) / 10 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7; code here
如果月日=28,月日=7,世纪年=9,世纪年=20

Java返回dayOfWeek=3(这是正确的!) JS返回dayOfWeek=4!(单数)


感谢您的反馈。

这是因为java正在执行整数运算,因为所有变量的类型都是
int

此代码:

int dayOfMonth = 28, monthOfYear = 7, yearOfCentury = 9, century = 20;
int result = (dayOfMonth + 26 * (monthOfYear +1) / 10 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7;
System.out.println(result);
输出

3
为什么?

你的手术意味着

(28 + 26*(7 + 1)/10 + 9 + 8/4 + 20/4 + 5 * 20) % 7.
如果您的变量都是
int
s,则每个结果都将被强制转换为int,因此您的表达式将变为

(28 + 20 + 9 + 2 + 5 + 100) % 7 = 164 % 7 = 3
26*(7+1)/10
20.8
,但它被强制转换为
int
,因此您将丢失小数部分

但是如果你把前两行改成

double dayOfMonth = 28, monthOfYear = 7, yearOfCentury = 9, century = 20;
double result = (dayOfMonth + 26 * (monthOfYear +1) / 10 + yearOfCentury + yearOfCentury / 4 + century / 4 + 5 * century) % 7;
输出将是

4.050000000000011

这与javascript的输出相同。然后使用
parseInt
函数(在java中是
Integer.parseInt
),因此最终结果将是
4

从反斜杠答案中重新获得建议:


var dayOfWeek=parseInt(parseInt(月日+26*parseInt(月日+1)/10+世纪年+parseInt(世纪年/4)+parseInt(世纪/4)+parseInt(5*century))%7)

干杯,所以改变了JS方程并得到了正确的输出:var dayOfWeek=parseInt(parseInt(dayOfMonth+26*parseInt(monthOfYear+1)/10+yearOfCentury+parseInt(yearOfCentury/4)+parseInt(century/4)+parseInt(5*century))%7)。似乎还有很长的路要走,有没有比用parseInt()分解表达式的每个部分更有效的方法?@dancingbush我认为没有,因为javascript没有java类型,一切都是
var
,你不能声明
int
,所以它会将double、int等视为一个通用数字,不关心整数除法。我认为如果不使用
parseInt
,您将始终拥有浮点操作(如果需要)。