Вопрос

Как получить длину дроби?Если это вообще возможно, без использования строковой операции или цикла

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 в любом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top