2009-02-25 6 views
2

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

should all return length of 3: 
5.234 
5.23400 
5.234000 

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

[EDIT]

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

+0

Это домашнее задание? –

ответ

2
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:

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

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

Чуть более элегантный

+0

Это хорошо. Я собираюсь согласиться на повторное разделение (я откажусь от идеи без петлирования) и подсчитаю «til 0», но не могу этого сделать, поскольку фракция - это то, чем я занимаюсь, а не целое число. Это хорошая логика! – Hao

0

Для не-дробной части, длина:

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

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

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

+0

Я сомневаюсь, что все, что связано с естественным журналом, может быть полезным. Поскольку String.format («% x», Double.doubleToRawLongBits (5.234)) дает 4014ef9db22d0e56, и это, сохраняя все цифры, оценивается до 5.2339999999999999857891452847979962825775146484375, тогда как 5.25 можно представить точно. 5.251 снова приближается к 5.25100000000000033395508580724708735942840576171875. Моя точка в том, что длина не монотонна в случае фракции. –

0

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

3

Учитывая, что вы обеспокоены отображением, а не внутренним представлением, почему бы просто не разделить конечные 0s?

#!/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"; 

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

+0

На самом деле 5.234 НЕ МОЖЕТ быть представлен в 64-битном целочисленном IEEE 745, он фактически будет приближен к 5.233999999999999985789145284797996282577514648437500 ;-) –

0

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

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

Для Java 1.4 см this page.

0

В Java:

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

я полагаю, вы можете хотите преобразовать строку в double.

Смежные вопросы