найти первую ненулевую цифру после десятичной точки с помощью VB.net

Я работаю, чтобы найти положение первой ненулевой цифры после десятичной точки

Пока мне удалось найти количество десятичных цифр, используя

Dim value As Single = 2.0533
Dim numberOfdecimaldigits As Integer = value.ToString().Substring(value.ToString().IndexOf(".") + 1).Length
MessageBox.Show(numberOfdecimaldigits)

если у меня 4.0342, то я хочу получить 2 на позицию 3 после десятичного значения. Что я хочу сделать с этими данными, так это добавить 2 к целому числу в зависимости от расположения ненулевой цифры. Например: для 4.0342 я хочу, чтобы система добавила к нему 0,02. Если это 5,00784, то я хочу добавить к нему 0,002.

Есть ли способ узнать позицию первой ненулевой цифры после десятичной точки?

заранее спасибо


person Satvir Singh    schedule 10.05.2016    source источник


Ответы (2)


Я настоятельно рекомендую не использовать здесь строки - вы выполняете числовой алгоритм, гораздо проще и эффективнее работать с числами, используя числовую логику:

value = value - Math.Floor(value) ' Get rid of integer digits
Dim position = 0

While value > 0 AndAlso Math.Floor(value) = 0
    value = value * 10
    position += 1
End While

If value = 0 Then Throw New Exception(…)
Return position
person Konrad Rudolph    schedule 10.05.2016
comment
У меня есть еще один вопрос. Я использую Dim a As Single = 7245.00758 MessageBox.Show (a), и когда я вижу сообщение, оно говорит 7245.008. Почему это не 7245.00758? Спасибо - person Satvir Singh; 10.05.2016
comment
@SatvirSingh Это нормально. Причина здесь: stackoverflow.com/q/588004/1968 - person Konrad Rudolph; 10.05.2016
comment
Спасибо за ссылку, она очень хорошо объяснила информацию - person Satvir Singh; 11.05.2016

Вот мой взгляд на то, что предотвращает бесконечный цикл

value = value - Math.Floor(value) ' Get rid of integer digits

If value = 0 Then Throw New Exception(...)

value = 1/value ' Invert the value
Dim position = 0

While value > 1
    value = value / 10
    position += 1
End While

Return position
person Alexandre ELIOT    schedule 17.09.2020