Сложение чисел до и после запятой
Написал код, но он не работает. Что я неправильно делаю?
using System;
namespace ConsoleApp12
{
class Program
{
class FloatNum
{
ulong integerPart;
ulong fractionalPart;
ulong d;
public FloatNum(ulong integerPart, ulong fractionalPart)
{
this.integerPart = integerPart;
this.fractionalPart = fractionalPart;
d = 1;
while (fractionalPart > 0)
{
d *= 10;
fractionalPart /= 10;
}
}
public void plus(FloatNum secondFloat)
{
this.integerPart += secondFloat.integerPart;
ulong frResult = this.fractionalPart + secondFloat.fractionalPart;
this.integerPart += frResult / this.d;
this.fractionalPart = frResult % this.d;
}
static void Main(string[] args)
{
FloatNum fl = new FloatNum(5, 123);
FloatNum fl1 = new FloatNum(6, 921);
fl.plus(fl1);
Console.WriteLine(fl);
Console.WriteLine(fl1);
}
}
}
}
Ответы (1 шт):
Судя по всему, самая большая проблема в этой строке:
ulong frResult = this.fractionalPart + secondFloat.fractionalPart;
Эта строка неявно предполагает, что количество знаков после запятой в обоих слагаемых одинаково. Это вовсе не обязательно так. Если ваши исходные числа new FloatNum(0, 1) и new FloatNum(0, 11), то при сложении дробных частей вы получите 12, а не 21.
Следующая проблема — ваш формат вовсе не позволяет выразить числа наподобие 1,01: ведущие нули в числах игнорируются, и в вашем конструкторе нет никакой возможности отличить случай 1,01 от 1,1.
Ещё одна мелкая проблема: у вас разрушающее сложение: сумма чисел записывается в первое слагаемое, таким образом, после сложения исходное число исчезает. Обычно всё же реализуют неразрушающее сложение, при котором слагаемые не меняются, а создаётся новое число, содержащее результат (благо C# содержит сборщик мусора, и о тонкостях владения результатами сложения можно не думать).
Что нужно делать? Необходимо отказаться от вашего метода хранения, и хранить целую и дробную часть вместе, в одном числе. Таким образом, у вам будет одно число, отвечающее за все десятичные знаки (мантисса), а также число, показывающее, сколько из этих знаков находится после запятой (порядок).
При сложении вам придётся обеспечить одинаковые порядки, для этого мантиссу числа с меньшим порядком придётся несколько раз умножить на 10 перед сложением.