Java,为什么 Math.sqrt() 返回 0
Java, why is Math.sqrt() returning 0
我正在尝试检查数字是否为正方形,以及数字是否为三角形。
问题发生在 sqrt(num),我测试的所有数字都返回 0。
我正在使用在线编译器,尝试了多个编译器,所以这不是编译问题。尝试将 num 声明为 double 和 int,结果相同。
我是 Java 的新手,但不是编程新手,我在网上搜索,多次检查我的代码,一切看起来都很好,它甚至在添加用于检查三角数的变量之前按预期工作,但在声明变量之后checkTri 和 checkTriSqr,这开始发生了。我确定这与声明这些变量无关(几乎可以肯定),谁能帮我理解这里发生了什么?
import static java.lang.Math.sqrt;
import static java.lang.Math.round;
public class Parent{
public static void main(String[] args){
class Number
{
public int num ;
double numSqr = sqrt(num );
double roundNumSqr = round(numSqr) ;
double checkTri = 8 * num + 1 ;
double checkTriSqr = sqrt(checkTri) ;
public void prinTest()
{
System.out.println(num);
System.out.println(numSqr);
System.out.println(roundNumSqr);
System.out.println(checkTri);
System.out.println(checkTriSqr);
}
public boolean isSqr()
{
if (numSqr == roundNumSqr)
{
return true;
}
else
{
return false;
}
}
public boolean isTriangular(){
if (checkTriSqr * checkTriSqr == checkTri )
{
return true;
}
else
{
return false;
}
}
}
Number number = new Number();
number.num = 350;
number.prinTest();
System.out.println(number.isSqr());
System.out.println(number.isTriangular());
}
}
编辑:以下屏幕截图来自我正在关注的教程,涉及在方法中声明 类!
这个:
public int num ;
double numSqr = sqrt(num );
在实例构造时将 num
初始化为 0(没有赋值时整数的默认值),然后 numSqr
立即设置(为零)。
您需要在每次设置 num
时重新计算 sqrt()
(可能通过提供方法 setNum()
并重新计算该方法中的所有内容)
我不会叫你的 class Number
,顺便说一句。标准 Java class 集合中已经有一个 Number class。
numSqr
在构造函数中创建,而 number.num = 350;
在对象构造之后声明。
您可以使用这样的构造函数:
public Numer(int num){
this.num=num;
this.numSqr=sqrt(num)
//.... ... ...
}
您还可以使用空构造函数和 setter 来设置数字属性:
public void setNumber(int num){
this.num=num;
this.numSqr=sqrt(num)
//.... ... ...
}
值 numSqr
、roundNumSqr
等都是在创建对象时设置的,但是在创建对象之前不要将 num
设置为任何值创建。结果是,例如,
创建时:
num = 0
因此
numSqr = 0
roundNumSqr = 0
等等
然后,你设置num = 350
但是你没有重新设置numSqr等的值,所以还是这样:
numSqr = 0
roundNumSqr = 0
您需要为此 class 创建一个构造函数,它接受 num 的值,然后设置所有相应的值,以便它们仅在设置 num 之后设置(或者,添加"calculate" 更新所有值的函数)。
其他答案已经说过,字段 num 没有设置为输入数字,其他字段实际上是在对象创建时评估的,因此也为零。
然而,目的是通过简单的功能实现的:
public static boolean isSquare(int num) {
int root = (int) Math.round(Math.sqrt(num));
return root*root == num;
}
public static boolean isCubic(int num) {
int root = (int) Math.round(Math.cbrt(num));
return root*root*root == num;
}
这利用了立方根。
作为double的比较,一个sqrt的结果和它的long值四舍五入还是不够精确,我宁愿重新计算原始参数。
public int num ;
double numSqr = sqrt(num);
默认情况下,声明的实例整数变量(在 class 体内声明的变量)初始化为 0(零)。因此,您的代码除了取零的 平方根外什么都不做,即零 .
您可以这样修改,并与您从事的技术进行比较。
import static java.lang.Math.sqrt;
import static java.lang.Math.round;
public class Number {
public int num = 0;
public void prinTest() {
System.out.println(this.num);
System.out.println(this.getSqrt(this.num));
System.out.println(this.getCheckTri());
}
private double getSqrt(double value) {
return sqrt(value);
}
public boolean isSqr() {
if (this.getSqrt(this.num) == round(this.getSqrt(this.num))) {
return true;
} else {
return false;
}
}
private double getCheckTri() {
return 8 * this.num + 1;
}
public boolean isTriangular() {
if (this.getSqrt(this.getCheckTri()) * this.getSqrt(this.getCheckTri()) == this.getCheckTri()) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
Number number = new Number();
number.num = 49;
number.prinTest();
System.out.println(number.isSqr());
System.out.println(number.isTriangular());
}
}
您应该阅读一些基础教程,因为您在 main 方法中添加了 class,这意味着您需要更多时间来检查语法。
我正在尝试检查数字是否为正方形,以及数字是否为三角形。
问题发生在 sqrt(num),我测试的所有数字都返回 0。
我正在使用在线编译器,尝试了多个编译器,所以这不是编译问题。尝试将 num 声明为 double 和 int,结果相同。
我是 Java 的新手,但不是编程新手,我在网上搜索,多次检查我的代码,一切看起来都很好,它甚至在添加用于检查三角数的变量之前按预期工作,但在声明变量之后checkTri 和 checkTriSqr,这开始发生了。我确定这与声明这些变量无关(几乎可以肯定),谁能帮我理解这里发生了什么?
import static java.lang.Math.sqrt;
import static java.lang.Math.round;
public class Parent{
public static void main(String[] args){
class Number
{
public int num ;
double numSqr = sqrt(num );
double roundNumSqr = round(numSqr) ;
double checkTri = 8 * num + 1 ;
double checkTriSqr = sqrt(checkTri) ;
public void prinTest()
{
System.out.println(num);
System.out.println(numSqr);
System.out.println(roundNumSqr);
System.out.println(checkTri);
System.out.println(checkTriSqr);
}
public boolean isSqr()
{
if (numSqr == roundNumSqr)
{
return true;
}
else
{
return false;
}
}
public boolean isTriangular(){
if (checkTriSqr * checkTriSqr == checkTri )
{
return true;
}
else
{
return false;
}
}
}
Number number = new Number();
number.num = 350;
number.prinTest();
System.out.println(number.isSqr());
System.out.println(number.isTriangular());
}
}
编辑:以下屏幕截图来自我正在关注的教程,涉及在方法中声明 类!
这个:
public int num ;
double numSqr = sqrt(num );
在实例构造时将 num
初始化为 0(没有赋值时整数的默认值),然后 numSqr
立即设置(为零)。
您需要在每次设置 num
时重新计算 sqrt()
(可能通过提供方法 setNum()
并重新计算该方法中的所有内容)
我不会叫你的 class Number
,顺便说一句。标准 Java class 集合中已经有一个 Number class。
numSqr
在构造函数中创建,而 number.num = 350;
在对象构造之后声明。
您可以使用这样的构造函数:
public Numer(int num){
this.num=num;
this.numSqr=sqrt(num)
//.... ... ...
}
您还可以使用空构造函数和 setter 来设置数字属性:
public void setNumber(int num){
this.num=num;
this.numSqr=sqrt(num)
//.... ... ...
}
值 numSqr
、roundNumSqr
等都是在创建对象时设置的,但是在创建对象之前不要将 num
设置为任何值创建。结果是,例如,
创建时:
num = 0
因此
numSqr = 0
roundNumSqr = 0
等等
然后,你设置num = 350
但是你没有重新设置numSqr等的值,所以还是这样:
numSqr = 0
roundNumSqr = 0
您需要为此 class 创建一个构造函数,它接受 num 的值,然后设置所有相应的值,以便它们仅在设置 num 之后设置(或者,添加"calculate" 更新所有值的函数)。
其他答案已经说过,字段 num 没有设置为输入数字,其他字段实际上是在对象创建时评估的,因此也为零。
然而,目的是通过简单的功能实现的:
public static boolean isSquare(int num) {
int root = (int) Math.round(Math.sqrt(num));
return root*root == num;
}
public static boolean isCubic(int num) {
int root = (int) Math.round(Math.cbrt(num));
return root*root*root == num;
}
这利用了立方根。
作为double的比较,一个sqrt的结果和它的long值四舍五入还是不够精确,我宁愿重新计算原始参数。
public int num ;
double numSqr = sqrt(num);
默认情况下,声明的实例整数变量(在 class 体内声明的变量)初始化为 0(零)。因此,您的代码除了取零的 平方根外什么都不做,即零 .
您可以这样修改,并与您从事的技术进行比较。
import static java.lang.Math.sqrt;
import static java.lang.Math.round;
public class Number {
public int num = 0;
public void prinTest() {
System.out.println(this.num);
System.out.println(this.getSqrt(this.num));
System.out.println(this.getCheckTri());
}
private double getSqrt(double value) {
return sqrt(value);
}
public boolean isSqr() {
if (this.getSqrt(this.num) == round(this.getSqrt(this.num))) {
return true;
} else {
return false;
}
}
private double getCheckTri() {
return 8 * this.num + 1;
}
public boolean isTriangular() {
if (this.getSqrt(this.getCheckTri()) * this.getSqrt(this.getCheckTri()) == this.getCheckTri()) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
Number number = new Number();
number.num = 49;
number.prinTest();
System.out.println(number.isSqr());
System.out.println(number.isTriangular());
}
}
您应该阅读一些基础教程,因为您在 main 方法中添加了 class,这意味着您需要更多时间来检查语法。