Рейтинг:
2
OriginalGriff
Это будет не так просто, как вы думаете: уменьшение наименьшей значащей цифры на единицу нормально для целочисленных значений, но значения с плавающей запятой не хранятся таким образом, который полностью совместим с этим: поскольку они хранятся в двоичном виде, они только "приближаются" к значению, которое вы видите, а не действительно удерживают фактическое значение.
И код, который вы показываете, имеет проблемы: целые числа вообще не содержат фракционной части числа, поэтому ваши два примера чисел оба дадут результат нуля.
Но... вы пытаетесь уменьшить наименьшую значащую цифру введенной пользователем строки, что на самом деле облегчает процесс!
Работайте со строкой напрямую, и вы сможете это сделать:
1) Определите индекс наименьшей значащей цифры: изначально это длина строки минус единица.
2) преобразуйте строку в массив символов
3) Теперь петля.
3.1) посмотрите на символ в указателе. Это ноль?
3.2) если это так, сделайте его девяткой, уменьшите индекс на единицу и продолжайте цикл.
3.3) В противном случае, является ли это периодом?
3.3.1) если это так, уменьшите индекс на единицу и продолжите цикл.
3.3.2) в противном случае уменьшите символ buy one и выйдите из цикла.
4) после цикла преобразуйте массив char обратно в строку и преобразуйте его в Double
GKP1992
Я рассматривал точку зрения, которую вы делаете в шаге 3.2, но я не пошел с ней, так как дробь с 0 в конце концов не имела смысла. Поскольку это введенная пользователем строка, это не обязательно.
OriginalGriff
Я подумал об этом, но решил, что если пользователь набрал их, то у него, вероятно, была причина...
Но избавиться от них несложно, достаточно обрезать нитку:
input = input.TrimEnd("0"C)
GKP1992
Я думаю, что обрезка даст неправильный результат, если я использую свое решение, 0.60-0.01 = 0.50, тогда как 0.6-0.1 = 0.5.
GKP1992
Только что протестировал свое решение с конечными нулями, оно работает : - D, хотя я и не собирался этого делать.
Рейтинг:
2
GKP1992
Из того, что я понимаю, вам нужно вычесть 1 из номинальной стоимости цифры, которая встречается в конце дроби.
Чтобы сделать это, сначала вам нужно будет найти позицию десятичной дроби в дроби, а затем вычесть 1/10^positionOfDecimal из числа.
Пример кода.
Dim result As Interger
Dim indexOfDecimalPoint As Integer = orig.text.IndexOf(".")
Dim numberOfDecimals As Integer = orig.text.Substring(indexOfDecimalPoint + 1).Length
result = Val(orig.text) - 1/(10^numberOfDecimals)
Приведенный выше код должен делать то, что вы пытаетесь.