如何解决20/3是6.666和6.667的问题?
本文关键字:问题 何解决 解决 | 更新日期: 2023-09-27 18:08:25
我想创建一个程序,让人们解决分数到小数的问题。
我有像20/3这样的问题,我认为男孩写6.666或6.667是正确的。
我正在设计这个公式:
ABS(RC - R) < 0.001
我的意思是RC是计算机的结果,R是男孩的结果。并比较结果是否正确。
我给用户一个分数问题,它包含解决方案(总是直到三个小数),我怎么做才能不强迫用户写出准确的答案?
顺便说一下,如果这不是分类,很抱歉。请帮忙编辑分类。
好的,我要求用户输入3位数字…所以,我在想是否有办法接受两位数。我想这是不可能的,但由于这个原因,我想对这种情况进行注释
我想你要找的是
if (ABS(RC - R) <= 0.001)
{
//the answer is close enough
}
我想我明白这个问题了。20/3的结果是6.6666反复出现,在这个应用程序中,正确答案将是6.666或6.667,但不是 6.665或6.668。
这里有一个解决方案,假设您总是希望精度降到小数点后3位。
decimal RC = 20/3;
decimal R = 6.666;
int numDecimals = 3; //edit this to change precision
public bool IsAnswerCorrect(decimal R, decimal RC, int numDecimals) {
int precision = Math.Pow(10, numDecimals);
RC *= precision;
R *= precision;
return R == Math.Floor(RC) || R == Math.Ceiling(RC);
}
使用ABS(RC - R) <= 0.001意味着应用程序将确定6.6656和6.6676之间的任何值为正确值。
Jace的答案看起来不错,但是如果没有测试,我不会相信它(因为这有点棘手)。
我会从写一些单元测试开始,来定义你期望的行为,就像这样:
void CloseButIncorrectAnswer_ShouldFail()
{
double computerResult = 20/3;
double resultToCheck = 6.665;
Assert.IsFalse (IsAnswerCorrect(computerResult, resultToCheck));
}
void AnswerMatchesToThreeDP_ShouldBeAccepted()
{
double computerResult = 20/3;
double resultToCheck = 6.666;
Assert.IsTrue (IsAnswerCorrect(computerResult, resultToCheck));
}
void CloseWithCorrectRoundingAnswer_ShouldBeAccepted()
{
double computerResult = 20/3;
double resultToCheck = 6.667;
Assert.IsTrue (IsAnswerCorrect(computerResult, resultToCheck));
}