分数长度

时间:2009-02-25 09:05:51

标签: math fractions

如何获得分数长度?如果可能的话,不使用字符串操作或循环

should all return length of 3:
5.234
5.23400
5.234000

接受任何编程语言

[编辑]

不是作业,我想以最小的分数显示分数。例如,我在数据库中定义了数字(18,8)。如果用户仅输入5.234,则保存在数据库中的数据为5.23400000。我只想将它显示为仅5.234

6 个答案:

答案 0 :(得分:3)

鉴于您关注显示而不是内部表示,为什么不剥离尾随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";

您可以将两者优化为单个正则表达式。

答案 1 :(得分: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")

没有字符串操作,没有循环。

修改

BTW,用循环来做这件事:

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

稍微优雅

答案 2 :(得分:0)

对于非分数部分,长度为:

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

只要v> 1其中ln()是自然对数,int()总是向下舍入。对于v == 1,ln(v)返回0,因此您必须在特殊情况下处理此问题。

应该有可能为小数部分(v - int(v))实现同样的事情,但我的数学失败了。

答案 3 :(得分:0)

只需实现除法算法。 并且当数字计数>时停止7或8位数(对于float32)

答案 4 :(得分:0)

使用Java和JDBC时,通过ResultSet.getBigDecimal()获取值。要获得正确的比例,请使用此代码(Java 5及更高版本; Java 1.4中存在一个错误,导致“0.0”失败):

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

对于Java 1.4,请参阅this page

答案 5 :(得分:0)

在Java中:

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

我假设你可能想要将字符串转换为双倍。