Олег Олегович
Просветленный
(22941)
7 лет назад
//double d = 100;
double d = 100.123456789012;
int i = 0;
while (d * Math.Pow(10, 1 + i) % 10 != 0) { i++; }
Console.WriteLine("У числа {0} {1} знаков после запятой.", d, i--);
f fУченик (64)
7 лет назад
"У числа 1,569975 7 знаков после запятой."
Эх, близко, но не то. Там алгоритм сложнее...
Sergey
Гуру
(2697)
7 лет назад
число дабл содержит 52+1 бит в мантиссе. Это соответствует ~15 десятичным знакам.
Если число цифр после запятой это, число значимых знаков после запятой в виде ХХХХ. YYYY, то это 15 - log10(число).
Сергей Куксенков
Просветленный
(42041)
7 лет назад
double number = 129.12563;
int count = BitConverter.GetBytes(decimal.GetBits((decimal)number)[3])[2];
Console.WriteLine(count); // 5
Как это работает тут: matthewedmondson . info / 2014 / 03 / reliance-on-implementation-details . html
Константин СамойловУченик (100)
1 месяц назад
decimal value = 123.456m;
int count = BitConverter.GetBytes(decimal.GetBits(value)[3])[2];
// count будет равен 3
Этот код:
decimal.GetBits(value) возвращает массив из 4 целых чисел, где последний элемент (индекс 3) содержит информацию о масштабе decimal
BitConverter.GetBytes() преобразует это число в массив байтов
Третий байт (индекс 2) содержит количество десятичных знаков
Преимущества этого метода:
Работает быстрее, чем строковые операции
Дает точный результат для типа decimal
Не зависит от культурных настроек (разделителей . или ,)
Недостатки:
Работает только с типом decimal (для double или float нужно сначала преобразовать в decimal)
Может быть менее очевидным для чтения кода