如何判断一个十进制数是否有限小数?

3

我正在创建一个程序,孩子们必须将十进制数值(例如0.xxxx - 精确度为4)转换为分数。

我需要知道一个分数是否终止,我的意思是:

1/9 ~ 0.111但是111/1000 = 0.111

我正在创建一个Fraction类,但我不知道如何区分这两种情况。

public class Fraction
{
    #region Fields

    private int _numerator;
    private int _denominator;

    #endregion

    #region Properties

    public int Numerator
    {
        get { return _numerator;}
        set { _numerator = value;}
    }

    public int Denominator
    {
        get { return _denominator;}
        set { _denominator = value;}
    }

    public decimal DecimalValue
    {
        get { return (decimal)_numerator / _denominator; }
    }

    #endregion

    #region Constructors

    public Fraction() { }
    public Fraction(int numerator, int denominator)
    {
        this.Numerator = numerator;
        this.Denominator = denominator;
    }

    #endregion
}

你能帮助我吗? 提前感谢。


如果它是无限的,那么分母为0或非常接近于0(取决于精度)。需要检查是否为0? - MyStream
对不起,您是在尝试确定您的分数是否为0.1循环吗?像0.111111...?还是您正在尝试确定所得到的分数实际上应该是无限大的表示形式?我现在有点困惑。 - blahman
1
http://en.wikipedia.org/wiki/Repeating_decimal - Mitch Wheat
9
分母为质数且不是2或5(即与10互质)的最简分数总会产生一个循环小数。 - Mitch Wheat
3个回答

11

找出分母的质因数分解。

如果所有的质因数都是2或5,则它会有一个有限的小数表示。

如果它有一个不是2或5的质因数,则它将成为一个循环小数。

(这个结论的原因是因为10的质因数是2和5。)

编辑 - 此外,请像 Stefan H 指出的那样检查 numerator % denominator 不等于0。


3
似乎不完整... 14/7没有循环小数。你漏掉了一个检查,即分子模以分母等于0。 - Stefan H
正因为如此,你的答案才不完整。这就是我想指出的。 - Stefan H
1
谢谢大家!这是代码...如果(分子 % 分母 == 0) 返回 false;var primes = Denominator.Primes();foreach (int n in primes) { 如果 (n != 2 && n != 5) 返回 true; }返回 false; - Darf Zon

3
我还没有对此进行详尽的分析以证明或证伪以下内容,但就我个人而言,以下针对整数的方法似乎可行...
如果没有余数,则无需担心。 如果有余数,并且分母除了2和5之外还有其他因子,则会产生重复小数。
如果分母是小数,则需要稍微调整上述规则。
希望这可以帮到您。

他的代码显示分子和分母是整数,没有小数部分。只是做个记录。 - doogle

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接