2009-02-25 57 views
2

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

should all return length of 3: 
5.234 
5.23400 
5.234000 

任何编程语言被接受

[编辑]

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

+0

这是功课吗? – 2009-02-25 09:08:26

回答

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 

稍微更优雅

+0

这个很好。我即将解决重复分割问题(​​我放弃了无环路的解决方案)并计算'直到0,但不能这样做,因为分数是我所追求的,而不是整数。这是一个很好的逻辑! – Hao 2009-02-26 01:35:18

0

对于非小数部分,长度是:

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

只要V> 1式中,Ln()是自然对数和INT()总是舍入。对于v == 1,ln(v)返回0,所以你必须在特殊情况下处理这个。

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

+0

我怀疑与自然日志有关的任何事情都可能是有价值的。因为String.format(“%x”,Double.doubleToRawLongBits(5.234))产生4014ef9db22d0e56,并且这个保留所有数字,估计为5.2339999999999999857891452847979962825775146484375,而5.25可以精确表示。再次通过5.25100000000000033395508580724708735942840576171875近似5.251。我的观点是长度在分数情况下不是单调的。 – 2012-07-02 22:46:14

0

只需实施除法算法。 当数字> 7或8位数字(用于float32)时停止,并且您停止

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"; 

你也许可以优化成一个单一的正则表达式。

+0

实际上,5.234不能用IEEE 745的64位整数表示,实际上它大约为5。233999999999999985789145284797996282577514648437500 ;-) – 2012-07-02 22:38:31

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。