- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做以下编程练习:Grasshopper Debug.声明如下:
Debug celsius converter
Your friend is traveling abroad to the United States so he wrote a program to convert fahrenheit to celsius. Unfortunately his code has some bugs.
Find the errors in the code to get the celsius converter working properly.
To convert fahrenheit to celsius:
celsius = (fahrenheit - 32) * (5/9)
Remember that typically temperatures in the current weather conditions are given in whole numbers. It is possible for temperature sensors to report temperatures with a higher accuracy such as to the nearest tenth. Instrument error though makes this sort of accuracy unreliable for many types of temperature measuring sensors.
我尝试过以下代码:
public class GrassHopper {
public static String weatherInfo(int temp) {
double c=convertToCelsius(temp);
if (c < 0)
return (c + " is freezing temperature");
else
return (c + " is above freezing temperature");
}
public static double convertToCelsius(int temperature) {
double celsius = (temperature-32)*(5/9.0);
return celsius;
}
}
我们发现了以下案例:
test5
expected:<31.11111111111111[] is above freezing t...> but was:<31.11111111111111[4] is above freezing t...>
我们认为这可能是因为使用了 double。然后我们使用 BigDecimal‽ 编写了相同的解决方案:
import java.math.BigDecimal;
import java.text.*;
public class GrassHopper {
public static String weatherInfo(int temp) {
BigDecimal c=convertToCelsius(BigDecimal.valueOf(temp));
NumberFormat oneDecimal = new DecimalFormat("#0.0");
c=c.toString().contains(".00") ? BigDecimal.valueOf(Double.parseDouble(oneDecimal.format(c))) : c;
if (c.compareTo(BigDecimal.ZERO) < 0)
return (c + " is freezing temperature");
else
return (c + " is above freezing temperature");
}
public static BigDecimal convertToCelsius(BigDecimal temperature) {
BigDecimal celsius = (temperature.subtract(BigDecimal.valueOf(32))).multiply(BigDecimal.valueOf(5/9.0));
return celsius;
}
}
测试结果如下:
test1
expected:<13.333333333333334[] is above freezing t...> but was:<13.333333333333334[4] is above freezing t...>
test5
expected:<-2.222222222222222[3] is freezing tempera...> but was:<-2.222222222222222[4] is freezing tempera...>
要了解发生了什么并尝试解决它,我们已阅读:
https://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html
How do i compare values of BigInteger to be used as a condition in a loop?
你能帮助我们吗‽
编辑:根据@GovindaSakhare提供的答案,我们可以写:
public class GrassHopper {
public static String weatherInfo(int temp) {
System.out.println("original celsius temp: "+temp);
double c=convertToCelsius(temp);
double roundedValue=roundoff(c,15);
String result = "";
if (roundedValue < 0){
result=roundedValue + " is freezing temperature";
}else{
result=roundedValue + " is above freezing temperature";
}
System.out.println("result: "+result);
return result;
}
public static double convertToCelsius(int temperature) {
double celsius = (temperature-32)*(5/9.0);
return celsius;
}
public static double roundoff(double temperature, int precisionLevel) {
double prec = Math.pow(10, precisionLevel);
return Math.round(temperature * prec) / prec;
}
}
但是,我们如何知道应该使用什么精度级别‽
我问这个问题是因为,通过前面的代码,我们观察到以下行为:
一些测试确实通过了:
test1
Log
temp: 56
result: 13.333333333333334 is above freezing temperature
test2
Log
temp: 23
result: -5.0 is freezing temperature
test4
Log
temp: 5
result: -15.0 is freezing temperature
还有一些没有通过:
test3
original celsius temp: temp: 33
expected:<0.55555555555555[5]6 is above freezing ...> but was:<0.55555555555555[]6 is above freezing ...>
test5
original celsius temp: 54
expected:<12.22222222222222[1] is above freezing t...> but was:<12.22222222222222[3] is above freezing t...>
我们认为它必须与最后一个练习的陈述部分相关:
"...Remember that typically temperatures in the current weather conditions are given in whole numbers. It is possible for temperature sensors to report temperatures with a higher accuracy such as to the nearest tenth. Instrument error though makes this sort of accuracy unreliable for many types of temperature measuring sensors. "
你会如何思考和行动来解决这个困难‽‽
编辑2:在@GovindaSakhare讨论链接之后,我们发现Java中的测试用例与我们预期的不同。我们尝试了用户 vztot 给出的提示,我们使用了 MathContext.DECIMAL128
我们尝试了以下方法:
import java.math.*;
import java.text.*;
public class GrassHopper {
public static String weatherInfo(int temp) {
BigDecimal c=convertToCelsius(BigDecimal.valueOf(temp));
if (c.compareTo(BigDecimal.ZERO) <= 0)
return (c + " is freezing temperature");
else
return (c + " is above freezing temperature");
}
public static BigDecimal convertToCelsius(BigDecimal temperature) {
BigDecimal division = BigDecimal.valueOf(5).divide(BigDecimal.valueOf(9.0),MathContext.DECIMAL128);
BigDecimal subtraction = temperature.subtract(BigDecimal.valueOf(32),MathContext.DECIMAL128);
BigDecimal celsius = subtraction.multiply(division,MathContext.DECIMAL128);
return celsius;
}
}
但是它在所有测试中都给出了错误:
test1
expected:<13.33333333333333[4] is above freezing t...> but was:<13.33333333333333[333333333333333333] is above freezing t...>
test2
expected:<-5.0[] is freezing tempera...> but was:<-5.0[00000000000000000000000000000000] is freezing tempera...>
test3
expected:<0.555555555555555[]6 is above freezing ...> but was:<0.555555555555555[555555555555555555]6 is above freezing ...>
test4
expected:<-15.0[] is freezing tempera...> but was:<-15.0[0000000000000000000000000000000] is freezing tempera...>
test5
expected:<34.44444444444444[] is above freezing t...> but was:<34.44444444444444[444444444444444445] is above freezing t...>
所以,我们决定更好地思考,我们应该使用 double 作为输入参数而不是 int:
public class GrassHopper {
public static String weatherInfo /*🌡️ℹ️*/ (double temp) {
double c = convertToCelsius(temp);
if (c <= 0)
return (c + " is freezing temperature");
else
return (c + " is above freezing temperature");
}
public static double convertToCelsius(double temperature) {
return (temperature - 32) * 5/9.0;
}
}
因此,最后一个版本确实通过了测试。
最佳答案
您可以使用org.apache.commons.math3.util.Precision.equals()
来自 Commons Math3。
关于java - 考虑最接近的十分之一将华氏度计算为摄氏度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60472822/
我一直认为使用“if”比捕获异常要好得多(就性能而言)。例如,这样做: User u = Users.getUser("Michael Jordan"); if(u!=null) System.
我正在尝试使用下一个格式将字符转换为日期。我有下一个数据框 i (我在最后添加了 dput() 版本的数据框): Date 1 Dec_28_2012_9:
考虑到 PHP 中的日期戳,我如何计算持续时间?我在日期之间使用的日期格式是“Y-m-d H:i:s”, 我的工作代码只能计算时间之间的持续时间而不考虑日期。 下面是我的代码: $assigned_t
我正在尝试解释 GLMM 中的自相关。我的响应变量是 bool 值,它表示一组 hive 的生命周期中是否存在 en 事件。我试图用一组描述每个巢状态的数值变量来预测此类事件的概率。因此,我在广义模型
我对如何解释 undefined variable 感到有点困惑(我不确定你现在是否可以)。我正在尝试使用以下代码底部附近的 if else 语句(已注释掉的行)。 这个想法是,如果请求歌曲的人不是与
Bjarne Stroustrup 的 The C++ Programming Language Fourth Edition 中的以下内容是什么意思? "Consider . (dot) suspe
我想要一个主元素,边 block 漂浮在它的右侧。我不知道边 block 的数量,也不知道它们的最终总高度。但是我的主要元素应该具有相同的高度(请参阅以下示例以更好地理解),而无需使用列。 (虚线部分
我在每个 TextView 上都有以下警告(来自 Lint),在我的 XML 中有一个 ID。 Consider making the text value selectable by specify
目前,我有 6 条曲线,以 6 种不同的颜色显示,如下所示。 这 6 条曲线实际上是由 一个相同实验 的 6 次试验生成的。这意味着,理想情况下它们应该是相同的曲线,但由于噪声和不同的试验参与者,它们
winner of a recent Wikipedia vandalism detection competition建议可以通过“检测考虑到 QWERTY 的随机键盘点击来改进检测键盘布局”。 示
多年来,我一直在编写 C 语言,主要是在嵌入式环境中,并且对指针有一个非常好的心智模型——我不必明确地考虑如何使用它们,我对指针算法 100% 感到满意,指针数组,指针指针等。 我写的 C++ 很少,
我正在使用 Boost.Date_time 来获取两个日期之间的时差。我希望代码在这些天也考虑夏令时的变化,并给我正确的时间间隔。 考虑这个例子。 2015 年 11 月 1 日,美国的 DST 将发
我有一个(人类)名字的向量,全部用大写字母表示: names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN")
我想呈现一个表单小部件。这是我要生成的原始 HTML: 使用这个: {{ form_row(form.email, { 'type' : 'email', 'attr' : { 'class' :
我正在开发一个 python 项目,它使用 pythonnet 和几个 C# dll 作为依赖项。 由于我不想将 dll 推送到 git 存储库,因此我调整了 .gitignore 文件。但是,现在
考虑到上午/下午,我想将字符串转换为 php 数据时间。 我想将 '03/06/2015 12:17 am' 转换为 php datatime。 我试过了, $myDateTime = DateTim
我想排除那些具有相同标题和同一年份的实例。 title votes ranking year 0 Wonderland 19 7.9 1931 1
例如对于一个 EditText,通常指定 android:inputType="numberDecimal"用于文本字段应该包含十进制数。但这假设“。”用作小数点分隔符,在某些国家/地区使用“,”代替
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
作为练习,我决定学习 Java 中的 lambda 表达式。我想重写我发现笨拙且冗长的旧代码。它检查命令行参数是否是(1)文件路径或(2)目录路径。在(1)场景中,它将命令行参数传递给方法。在 (2)
我是一名优秀的程序员,十分优秀!