有理数的最短十进制表示

  • 本文关键字:十进制 表示 有理数 c#
  • 更新时间 :
  • 英文 :


我想用A/B的格式表示两个数字,其中AB是任意整数。我想要最短格式的十进制结果。

例子:

  • 3/28的最短十进制表示为"0.10(714285)"
  • 1/7的十进制表示为"0.(142857)"

我如何用c#做到这一点?

希望有人能把它转换成c#代码:

def get_decimal(a, b):
    result = str(a / b) + '.'
    r = a % b
    remainders = []
    while r not in remainders:
        remainders.append(r)
        result += str(10 * r / b)
        r = 10 * r % b
    return result
一些测试:

>>> get_decimal(1, 7)
'0.142857'
>>> get_decimal(10, 7)
'1.428571'
>>> get_decimal(3, 28)
'0.10714285'
>>> get_decimal(99099167, 990000000)
'0.100100168'

如果你需要用圆括号来表示重复的数字集合,那么像这样:

def get_decimal(a, b):
    result = str(a / b) + '.'
    r = a % b
    remainders = []
    digits = []
    while r not in remainders:
        remainders.append(r)
        digits.append(str(10 * r / b))
        r = 10 * r % b
    start = remainders.index(r)
    result += ''.join(digits[0:start]) + '(' + ''.join(digits[start:]) + ')'
    return result
一些测试:

>>> get_decimal(1, 7)
'0.(142857)'
>>> get_decimal(10, 7)
'1.(428571)'
>>> get_decimal(3, 28)
'0.10(714285)'
>>> get_decimal(99099167, 990000000)
'0.1001001(68)'

我想你想要得到小数点后2位的结果…您可以使用

double result = 0.142857; 
int decimalPlaces = 2;//for two decimal places
double multiplier = Math.Pow(10, Convert.ToDouble(decimalPlaces));
result =  Math.Ceiling(result * multiplier) / multiplier;

最新更新