【发布时间】:2023-01-18 01:29:39
【问题描述】:
public static boolean isSquare(int n) {
return Math.sqrt(n) % 1 == 0;
我只是在寻找一个解释。
【问题讨论】:
-
您是否研究过
Math.sqrt(n)对正方形与非正方形的回报?你知道%是做什么的吗?
标签: java
public static boolean isSquare(int n) {
return Math.sqrt(n) % 1 == 0;
我只是在寻找一个解释。
【问题讨论】:
Math.sqrt(n) 对正方形与非正方形的回报?你知道% 是做什么的吗?
标签: java
Math.sqrt(n)唯一存在的
sqrt方法采用double并返回double。double是一个 64 位 IEEE754 风格的浮点数。sqrt是“平方根”的缩写。例如,16 的平方根是 4。Math.sqrt(16)返回4.0。因此,java 默默地将
n转换为double值(这总是完美的;double值不能代表每个数字,但它们可以代表每个int)。然后它执行平方根运算并将结果四舍五入为最接近的可以用double完美表示的数字。如果输入是平方数,这将是完美的(因为所有整数都可以完美地表示为双精度数)。如果输入不是正方形,则四舍五入到最接近的可表示双精度的结果极有可能是不是一个整数。其中很多内容有点模糊,因为 IEEE 浮点数学非常复杂。 Read the wikipedia 了解更多信息。
然后在
that % 1操作中使用此双精度值。这归结为:从数字中重复减去1.0,直到你不能再这样做;剩下什么?换句话说,
% 1double 或多或少是“去掉整数位,只给我逗号后的内容”。更简单:如果 double 根本没有小数部分,someDouble % 1 == 0为真,否则为假。因此,这会检查:嘿,如果你取输入的平方根,你有小数部分还是最终结果是整数?如果它是一个整数,则输入是正方形,否则不是。
【讨论】: