C#: Приведение рациональной дроби к строке

140
08 июля 2019, 19:00

Пишу класс для бесконечных чисел с плавающей точкой. Однако, конвертация в строку происходит неправильно. Сам код:

public string ToString(int precision) {
    BigInteger remainder;
    BigInteger result = BigInteger.DivRem(numerator, denominator, out remainder);
    if (remainder == 0)
        return result.ToString();
    BigInteger decimals = (numerator * BigInteger.Pow(10, precision)) / denominator;
    if (decimals == 0)
        return result.ToString();
    StringBuilder sb = new StringBuilder();
    while (precision-- > 0 && decimals > 0) {
        sb.Append(decimals % 10);
        decimals /= 10;
    }
    return result + "." + new string(sb.ToString().Reverse().ToArray());
}

Дело в том, что после точки не дописываются нули, так, при делении 3/34 должно быть 0.0882..., но получается 0.882... Проблема, очевидно в этой строке:

BigInteger decimals = (numerator * BigInteger.Pow(10, precision)) / denominator;

Пожалуйста, подскажите как можно узнать сколько нулей должно быть и нормализовать вывод.

Answer 1

Уберите здесь одну проверку, из-за нее не добавляются нужные нули в конце:

while (precision-- > 0 /* && decimals > 0 */) {
    sb.Append(decimals % 10);
    decimals /= 10;
}
READ ALSO
Touch узнать когда палец сменил направление

Touch узнать когда палец сменил направление

Как узнать если палец двигался и сменил направление то есть двигался в перед а потом начал назад

131
Как правильно спрятать ORM?

Как правильно спрятать ORM?

Допустим есть БД и взаимодействие с ней выполняется через какое-то ORM

135
Получить данные выбранной строки DataGrid в MVVM

Получить данные выбранной строки DataGrid в MVVM

Как получить данные выбранной строки DataGrid в MVVM? Если я правильно понимаю, данные выбранной строки DataGrid попадают в SelectedProduct, а оттуда раздаются...

132
Асинхронное выполнение задач PHP [закрыт]

Асинхронное выполнение задач PHP [закрыт]

Как сделать как на видео:

147