Member 13462396 Ответов: 2

В. Б. Как я могу вычесть .1 ряд?


например, у меня есть 0.093, его выход должен быть 0.092. другой пример, если у меня есть 0.15, он должен быть 0.14 и так далее для других. я пробую этот код: но результат для 0.093 равен -0.007

Что я уже пробовал:

тусклый результат в виде целого числа
результат = val(ориг. текст) - .1

2 Ответов

Рейтинг:
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)


Приведенный выше код должен делать то, что вы пытаетесь.