双重数学不知道为什么,由 .00000000x
Double math off no idea why, by .00000000x
我不知道我做错了什么。我的数学有问题,但最少。
我尝试更改 DecimalFormat,但我知道它现在设置的位置是正确的。我查看了使用 long 但我不明白为什么这会有所不同我不会超过 double 的大小。
我确保检查我是否使用了所有双打。我什至不确定如何解决这个问题。
输入数据:
12
657 7
9079 13
9551 8
4633 7
8622 12
98 2
254 2
12040 11
14711 10
46254 8
8978
62424 2
预期结果:
25.6343560524 95.2837866586 98.7716099678 71.3069977502 92.8547252433 25.7398989899 64.7460784314 109.726933795 121.288922541 258.904619449 566.427585376 15607.249984
我的结果:
25.6343560524 95.2837866586 98.7716099678 71.3069977502 92.8547252433 25.7398989899 64.7460784314 109.7269337948 121.2889225409 258.9046194492 566.4275853759 15607.2499839808
我的代码:
package com.secryption.CA18SquareRoot;
import java.text.DecimalFormat;
import java.util.Scanner;
public class SquareRoot {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("Enter Data: ");
int numberOfTestCases = myScanner.nextInt();
double r;
DecimalFormat df = new DecimalFormat("##.##########");
for (int i = 0; i < numberOfTestCases; i++) {
r = 1.0;
int calculateSquareRootFor = myScanner.nextInt();
int numberOfSteps = myScanner.nextInt();
double d;
if (numberOfSteps > 0) {
for (int w = 0; w < numberOfSteps; w++) {
d = (double) calculateSquareRootFor / r;
r = (r + d) / 2.0;
}
}
System.out.print((df.format(r) + " "));
}
}
}
编辑:与网站所有者交谈后,double 是正确的。我最终尝试了几个不同的数据集,它最终认为它是正确的。
并非所有值都可以用 double
精确表示。无法估算的值将被近似,这就是您在这里遇到的情况。
例如,值1/3不能写成有限十进制数:它会无限长,0.333333...,但它可以写成三元系统中的有限数,例如,它会是 0.1,或者在十进制系统中近似为,例如0.333334(差了一点点)。
以此类推,有很多值不能精确表示为二进制数,double
内部就是这样用的。例如,不可能将 0.1 存储为二进制数,精确表示将无限长,因此 double 将使用近似值。
我不知道我做错了什么。我的数学有问题,但最少。
我尝试更改 DecimalFormat,但我知道它现在设置的位置是正确的。我查看了使用 long 但我不明白为什么这会有所不同我不会超过 double 的大小。
我确保检查我是否使用了所有双打。我什至不确定如何解决这个问题。
输入数据:
12
657 7
9079 13
9551 8
4633 7
8622 12
98 2
254 2
12040 11
14711 10
46254 8
8978
62424 2
预期结果:
25.6343560524 95.2837866586 98.7716099678 71.3069977502 92.8547252433 25.7398989899 64.7460784314 109.726933795 121.288922541 258.904619449 566.427585376 15607.249984
我的结果:
25.6343560524 95.2837866586 98.7716099678 71.3069977502 92.8547252433 25.7398989899 64.7460784314 109.7269337948 121.2889225409 258.9046194492 566.4275853759 15607.2499839808
我的代码:
package com.secryption.CA18SquareRoot;
import java.text.DecimalFormat;
import java.util.Scanner;
public class SquareRoot {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("Enter Data: ");
int numberOfTestCases = myScanner.nextInt();
double r;
DecimalFormat df = new DecimalFormat("##.##########");
for (int i = 0; i < numberOfTestCases; i++) {
r = 1.0;
int calculateSquareRootFor = myScanner.nextInt();
int numberOfSteps = myScanner.nextInt();
double d;
if (numberOfSteps > 0) {
for (int w = 0; w < numberOfSteps; w++) {
d = (double) calculateSquareRootFor / r;
r = (r + d) / 2.0;
}
}
System.out.print((df.format(r) + " "));
}
}
}
编辑:与网站所有者交谈后,double 是正确的。我最终尝试了几个不同的数据集,它最终认为它是正确的。
并非所有值都可以用 double
精确表示。无法估算的值将被近似,这就是您在这里遇到的情况。
例如,值1/3不能写成有限十进制数:它会无限长,0.333333...,但它可以写成三元系统中的有限数,例如,它会是 0.1,或者在十进制系统中近似为,例如0.333334(差了一点点)。
以此类推,有很多值不能精确表示为二进制数,double
内部就是这样用的。例如,不可能将 0.1 存储为二进制数,精确表示将无限长,因此 double 将使用近似值。