【问题标题】:Why is my Java calculated answer slightly higher from my TI-84 Plus Calculator and Google's calculated answer even though I used the same formula?为什么即使我使用相同的公式,我的 TI-84 Plus 计算器和 Google 的计算答案也比我的 Java 计算答案略高?
【发布时间】:2020-02-08 16:45:19
【问题描述】:

概述

使用 DrJava,我根据外星人入侵计算了“估计受损的玉米植物”,该入侵留下了麦田圈 x 直径(以英尺为单位)(用户输入)。我做了一个计算来确定一英亩是 43560 英尺等于 1 英亩。每毁坏一英亩,就会毁坏 30000 株玉米。

我要求澄清为什么我的程序得到的答案与我的计算器略有不同的输出是“估计玉米植物受损”。

当用户输入 80 时我的 Java 程序的输出

估计受损的玉米植株:3462

我的计算器和谷歌最终计算出的直径相同

估计受损的玉米植株:3450

我的措辞解决方案

我得到了不同的输出,因为 dAcres 变量的输出格式设置为四舍五入到小数点后 3 位,但它用于计算的值没有四舍五入。例如,当用户输入 80 作为直径时,dAcres 变量输出 0.115。但是,dAcre 变量在其计算中使用 .11539。

最后一个问题

如何使我的计算只使用 3 位小数而不是默认的小数位数?示例:0.115 而不是 0.11539?

我的代码

import java.util.*;
import java.text.*;


public class Lab2_Problem2
{
  public static final double dPI = 3.14159;

  public static void main(String[] args )
  {
    // DECLARATIONS
    // Input-capture variables
    double dDiameter;

    // Expression-result variables
    double dArea;
    double dAcres;
    double dCornPlantsDamaged;

    // Other variables
    double dRadius;
    double dRadiusSquared;

    // Instantiations
    Scanner cin = new Scanner(System.in);
    DecimalFormat dfDiameter = new DecimalFormat("#######");
    DecimalFormat dfArea = new DecimalFormat("#######.00");
    DecimalFormat dfAcres = new DecimalFormat("##0.000");
    DecimalFormat dfCornPlantsDamaged = new DecimalFormat("#####");

    // INITIALIZE 
    // INPUT
    System.out.print("Enter crop circle diameter in feet: ");
    dDiameter = cin.nextDouble();

    // PROCESSING AND CALCULATIONS
    dRadius = dDiameter / (double) 2;
    dRadiusSquared = dRadius * dRadius;
    dArea = dPI * dRadiusSquared;
    dAcres = dArea / (double) 43560;
    dCornPlantsDamaged = dAcres * (double) 30000;

    // OUTPUT
    System.out.println("Crop circle diameter: " + dfDiameter.format(dDiameter) + " feet");
    System.out.println("Square feet: " + dfArea.format(dArea));
    System.out.println("Acres: " + dfAcres.format(dAcres));
    System.out.println("Estimated corn plants damaged: " + 
dfCornPlantsDamaged.format(dCornPlantsDamaged));
  }
}

问答

  1. 如果您的计算器不支持,您为什么要计算小数点后 3 位?
    1. 因为我希望输出与正在进行的计算相匹配。

【问题讨论】:

  • Math.PI 用于 pi
  • 如果我在计算器中输入这个,我得到 3461.8... 所以你的程序输出正确的值。为什么要引入舍入误差?当你说谷歌输出不同的结果时,你到底是什么意思?在搜索字段中使用计算器还是在哪里?
  • 你真的想让你的程序以一个错误的方式兼容一些不太正确的东西吗?
  • @NomadMaker 你是对的,但与此同时,我仍然想知道我的问题的答案。这是为了练习和信息目的而不是准确性。我发布了一个关于你要说的答案,但我仍然想要一个编码的答案。
  • 您可以编写一个类似于 BigDecimal 的类,但我强烈建议您找些有成效的事情去做。

标签: java calculation decimalformat


【解决方案1】:

这是来自@cricket_007 给出的答案的示例形式的工作代码。

dTruncOne = dAcres * 1000;
dTruncTwo = (int) dTruncOne * (double) 30000; // Truncated acres
dCornPlantsDamaged = dTruncTwo / (double) 1000;

dBushelsPerAcre = 211;
dCostPerBushel = 3.90;

【讨论】:

    【解决方案2】:

    我如何做到这样我的计算只使用 3 位小数

    将它乘以一个完整的整数,截断小数,然后将它除回到一个小数

    ((int) (0.11539 * 1000)) / 1000.0

    另外,还有Math.round 方法

    不过,您的计算器不会使用 3 位小数,所以我不确定您为什么要这样做

    而且,为简单起见,您可以像这样写出公式

    destroyed_acres = ((pi * (d/2)^2) ft) * (acre/ft) 
    ans = (corn/acre) * destroyed_acres
    

    FWIW,wolframalpha 说 3462

    https://www.wolframalpha.com/input/?i=+%28%28pi+*+%2880%2F2%29%5E2%29+square+feet%29+to+acres+*+30000

    谷歌也是(π × (80 ÷ 2)^2) × (1 ÷ 43560) × 30000

    【讨论】:

    • 这会截断多余的小数。通常,当您降低数字的精度时,您希望结果是四舍五入的,而不是截断的。
    • 怎么样?平方英尺
    • 你愿意看到(Pi*r^2) ft
    • 这不是实际的代码...这是一个表达式。插入符号是指数。在 Google 计算器或 wolfram alpha 中试用
    • 5 个变量 vs 2 个?
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2012-03-17
    • 2019-04-29
    相关资源
    最近更新 更多