Попробуйте войти 10 (макс (абс ( число ), 0,5)) + 1 округлено в меньшую сторону.
Или, в фактическом синтаксисе C #:
(int)(Math.Log10(Math.Max(Math.Abs(number), 0.5)) + 1)
Хорошо, как это работает?
Прежде всего, p = log 10 ( x ) - основание-10 логарифм из x ;то есть значение, такое, что 10 повышается до p -й степени (или 1, за которым следует p нулей), равно x .Логарифм по существу измеряет длину числа, за исключением того, что это гладкая функция: x :
(обратите внимание, что в языках, которые непредоставить функцию логарифма base-10, мы всегда можем рассчитать ее как log 10 ( x ) = log ( x ) / log (10), где log() - логарифмическая функция в любой базе.)
Например, у нас есть
log 10 (1) = 0,0
log 10 (10) = 1,0
log 10 (100) = 2,0
log 10 (1000) = 3,0
но также, например:
log 10 (5) = 0,69897
log 10 (50) = 1.69897
log 10 (500) = 2,69897
log 10 (5000) = 3,69897
В общем n ≤ log 10 ( x ) <<em> n + 1 всякий раз, когда 10 n ≤ x <10 <sup> n + 1 .
Глядя на значения выше, это должно быть легкоy достаточно, чтобы увидеть, что, чтобы получить число цифр с основанием 10 в целом числе, мы должны округлить его логарифм с основанием 10 до ближайшего целого числа и добавить 1 (потому что мы хотим, чтобы длина 10 была 2, а не1).
Однако следует рассмотреть еще несколько крайних случаев:
Во-первых, первоначальный спрашивающий хотел, чтобы длина - x равнялась длине х .Логарифм определен только для положительных чисел, поэтому мы заменяем x на его абсолютное значение, чтобы оно всегда было положительным.
Во-вторых, первоначальный спрашивающий также хотел, чтобы длина чисел была от 0 до 1быть нулем.Однако логарифм может принимать произвольно большие отрицательные значения:
log 10 (0,1) = -1,0
log 10 (0,01) =−2.0
log 10 (0.001) = −3.0
log 10 (0.0001) = −4.0
и действительно, log 10 (0) = −∞.Чтобы удовлетворить это требование, мы просто следим за тем, чтобы число, длину которого мы вычисляем, никогда не опускалось ниже 0,5, используя его максимальное значение и 0,5 в качестве входных данных для log 10 ().(Мы можем использовать любое число от 0,1 до 1 в качестве отсечки, но 0,5 оказывается хорошей круглой двоичной дробью.)
Кроме того, мы должны обязательно добавить +1 к логарифму перед тем, как округление, так что число, которое мы округляем, всегда неотрицательно.Это потому, что (int)
в C # фактически округляет отрицательные числа до до нуля.Например, поскольку log 10 (0,5) ≈ -0,3, выражение (int)Math.Log10(0.5) + 1
(округление до добавления) будет иметь значение 0 + 1 = 1, а не ожидаемое 0.