Вопрос
Как получить длину дроби?Если это вообще возможно, без использования строковой операции или цикла
should all return length of 3:
5.234
5.23400
5.234000
Принимается любой язык программирования
[ПРАВИТЬ]
Это не домашнее задание, я хочу отобразить дроби как минимум.Например, я определил числовое значение (18,8) в базе данных.Если пользователь ввел только 5.234, то данные, сохраненные в базе данных, равны 5.23400000.Я просто хочу отобразить его обратно только как 5.234
Решение
If Int(num) = num Then Return 0
num *= 10
If Int(num) = num Then Return 1
num *= 10
If Int(num) = num Then Return 2
num *= 10
If Int(num) = num Then Return 3
num *= 10
If Int(num) = num Then Return 4
num *= 10
If Int(num) = num Then Return 5
num *= 10
If Int(num) = num Then Return 6
num *= 10
If Int(num) = num Then Return 7
num *= 10
If Int(num) = num Then Return 8
Throw New Exception("Number exceeds expected precision")
Никаких строковых операций, никаких циклов.
Редактировать:
Кстати, чтобы сделать это с помощью цикла:
result = 0
Do While (Int(num) !> num)
num *= 10
result += 1
Loop
Return result
Немного более элегантный
Другие советы
Учитывая, что вас беспокоит отображение, а не внутреннее представление, почему бы просто не убрать конечные значения 0?
#!/use/bin/perl
my @nums = ( '5.234', '5.23400', '5.234000' );
$_ =~ s/0+$// for @nums; # remove trailing 0s
$_ =~ s/\.$// for @nums; # remove trailing .
print "@nums\n";
Вероятно, вы можете оптимизировать и то, и другое в одно регулярное выражение.
Для части, не состоящей из фракций, длина равна:
int((ln(v)/ln(10))+.999)
пока v > 1, где ln() - натуральный логарифм, а int() всегда округляет в меньшую сторону.Для v == 1 ln(v) возвращает 0, поэтому вы должны обработать это в особом случае.
Должно быть возможно достичь того же самого для дробной части (v - int(v)
) но моя математика меня подводит.
Просто реализуйте алгоритм деления.И вы останавливаетесь, когда количество чисел превышает 7 или 8 цифр (для float32)
При использовании Java и JDBC получите значение через Результирующий набор.getBigDecimal().Чтобы получить правильный масштаб, используйте этот код (Java 5 и выше;в Java 1.4 есть ошибка, из-за которой он не работает для "0.0"):
int precision = v.stripTrailingZeros().scale();
Для Java 1.4 см. эта страница.
На языке Java:
Double.valueOf("5.34000").toString();
Я предполагаю, что вы, возможно, захотите преобразовать строку в double в любом случае.