如何解决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位数字…所以,我在想是否有办法接受两位数。我想这是不可能的,但由于这个原因,我想对这种情况进行注释

如何解决20/3是6.666和6.667的问题?

我想你要找的是

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));
}