Преобразование целого числа в дробное (десятичное) - PullRequest
0 голосов
/ 29 мая 2020

Ищете способ преобразовать положительное число (целое), например, из 123 в 0,123 без использования строк. Может быть целым числом любого размера. Меня не беспокоят отрицательные значения.

Dim value As Integer = 123
Dim num As Decimal = "." & value.ToString

Это кажется простым, но я не уверен, как это сделать с помощью математики. Как преобразовать без использования строк?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Вы можете получить количество цифр, используя Log10. Я думаю, что лучший способ:

Dim value = 123 'Or whatever other value
Dim digitCount = Math.Floor(Math.Log10(Math.Abs(value))) + 1
Dim result = value * CDec(10 ^ (-digitCount))

Вам нужно использовать Floor, а не Ceiling, чтобы получить правильный результат для 0, 10, 100 и т.д. c.

1 голос
/ 29 мая 2020

Вот один из способов:

Dim value As Integer = 123
Dim num As Decimal = value

While Math.Abs(num) >= 1
    num = num / 10
End While

Math.Abs ​​заботится о негативе, поэтому вы можете удалить его, если говорите, что вас это не касается.

Это также работает :

Dim value as Integer = 123
Dim num as Decimal = value

num /= 10 ^ Math.Ceiling(Math.Log10(value))

Сначала немного сложнее увидеть, что происходит, но в основном он находит следующую степень 10, которая выше числа, и делит на 10 ^ (эту степень)

Edit Согласно ответу Крейгса Math.Floor, затем добавить один работает лучше, чем Math.Ceiling, таким образом:

Dim value as Integer = 123
Dim num as Decimal = value

num /= 10 ^ (Math.Floor(Math.Log10(value)) + 1)

Edit Я только что провел быстрое сравнение производительности , а на моем P C выполнение While l oop заняло 851 мс, а метод Log10 - 158 мс. Это для 1000000 итераций каждого.

...