Длина фракции - PullRequest
       12

Длина фракции

2 голосов
/ 25 февраля 2009

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

should all return length of 3:
5.234
5.23400
5.234000

Допускается любой язык программирования

[EDIT]

Не домашнее задание, я хочу отображать дроби как минимум. Например, я определил числовой (18,8) в базе данных. Если пользователь ввел только 5,234, данные, сохраненные в базе данных, будут 5,23400000. Я просто хочу отобразить его как 5.234

Ответы [ 6 ]

3 голосов
/ 25 февраля 2009

Учитывая, что вы беспокоитесь о отображении, а не о внутреннем представлении, почему бы просто не убрать конечные 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";

Вероятно, вы можете оптимизировать оба в одном регулярном выражении.

2 голосов
/ 25 февраля 2009
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")

Без строковых операций, без циклов.

EDIT:

Кстати, чтобы сделать это с помощью цикла:

result = 0
Do While (Int(num) !> num) 
    num *= 10
    result += 1
Loop
Return result

чуть элегантнее

0 голосов
/ 26 февраля 2009

В Java:

Double.valueOf("5.34000").toString();

Полагаю, вы все равно можете преобразовать строку в удвоенную.

0 голосов
/ 25 февраля 2009

При использовании Java и JDBC получите значение через ResultSet.getBigDecimal () . Чтобы получить правильный масштаб, используйте этот код (Java 5 и выше; в Java 1.4 есть ошибка, которая приводит к сбою для «0.0»):

int precision = v.stripTrailingZeros().scale();

Для Java 1.4 см. эту страницу .

0 голосов
/ 25 февраля 2009

Просто реализуй алгоритм деления. И вы останавливаетесь, когда число считается> 7 или 8 цифр (для float32)

0 голосов
/ 25 февраля 2009

Для части без дроби длина:

int((ln(v)/ln(10))+.999)

до тех пор, пока v> 1, где ln () - натуральный логарифм, а int () всегда округляется. Для v == 1 ln (v) возвращает 0, поэтому вы должны обработать это в особом случае.

Должно быть возможно достичь того же самого для дробной части (v - int(v)), но моя математика не удалась.

...