【问题标题】:Is it the math or a coding error?是数学错误还是编码错误?
【发布时间】:2013-11-21 17:01:49
【问题描述】:

我正在编写一个程序来计算行星的表面重力 (http://en.wikipedia.org/wiki/Surface_gravity)(是的,我知道我可以用谷歌搜索它,但那有什么乐趣呢?)但是数字不正确,我的 printf 也不正确用于包含 2.2 格式的数字的方法。我在这里做错了什么?谢谢!

import java.util.Scanner;

import java.io.PrintWriter;

import java.io.File;

import java.io.IOException;

public class GravityV1
{

static String [] planetName = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"};
static double [] planetMass = {3.30e23, 4.87e24, 5.97e24, 6.42e23,1.90e27, 5.69e26, 8.66e25, 1.03e26, 1.31e22};
static double [] planetDiameter = {3032, 7521, 7926, 4222, 88846, 74898, 31763, 30778, 1466};
static double universalConstant = 6.674e-11;

public static double getSurfaceGravity(double mass, double diameter) 
{

    double g = (universalConstant * mass)/Math.pow((diameter / 2), 2);
    return g; 

}

public static void printHeader() 
{ 
   System.out.println("                       Planetary Data                       ");
   System.out.println("  Planet       Diameter (km)      Mass (kg)      g (m/s^2)  ");
   System.out.println("------------------------------------------------------------");
}
public static void tab() 
{
   System.out.print("\t\t");
 }
public static void main(String [] args)throws IOException
{
PrintWriter outFile = new PrintWriter (new File("planetGravity.txt"));
printHeader();
outFile.println("                       Planetary Data                       ");
outFile.println("  Planet       Diameter (km)      Mass (kg)      g (m/s^2)  ");
outFile.println("------------------------------------------------------------"); 
   for(int index=0;index<planetName.length;index++) 
  {
   double gravity = getSurfaceGravity(planetMass[index], planetDiameter[index]); 
   System.out.print(planetName[index] + "\t\t");
   System.out.printf("%2.2f", planetDiameter[index]);
   tab();
   System.out.printf("%2.2f", planetMass[index]);
   tab();
   System.out.printf("%2.2f", gravity);
   System.out.println();
   outFile.println(planetName[index] + "\t\t" + (planetDiameter[index]) + "\t\t" + planetMass[index] + "\t\t" + gravity);
  }
  outFile.close();
}
}

【问题讨论】:

  • 为什么数字不正确? printf 如何不“包含”这些数字?你得到的输出是什么,你认为它应该是什么?
  • 预期/实际输出是多少?
  • 一行:Mercury 3032.00 330000000000000000000000.00 9583005.55 我希望它是:Mercury 3032 3e23 .38
  • %2.2f一致。
  • 使用 %2.2e 获取指数值(e 说明符而不是 f)。请参阅 Java Formatter 类。

标签: java math gravity


【解决方案1】:

您需要进行一些单位转换以修正您的计算。

  1. 您的行星直径以英里为单位。您需要将它们转换为米。你可以通过在你的 planetDiameter 数组中进行一些乘法来做到这一点。例如,将 3032 替换为 3032 * 1000 * 1.609344。或者你可以在getSurfaceGravity

    double g = (universalConstant * mass)/Math.pow((1000 * 1.609344 * diameter / 2), 2);
    
  2. 在从getSurfaceGravity 返回之前,您应该将 g 除以地球表面重力 (9.80665 m / s^2)。所以最后一行变成了:

    return g / 9.80665;
    

需要除以地球表面重力,因为您说水星的预期值为 0.38。这意味着您需要以地球重力为单位的值。 (水星表面重力 = 0.38 * [地球表面重力])。

按照 cmets 中的建议,使用 %2.2e 以科学计数法格式化您的数字。

同意自己计算比谷歌更有趣!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2012-04-08
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多