2

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

should all return length of 3:
5.234
5.23400
5.234000

接受任何编程语言

[编辑]

不是家庭作业,我想以最低限度显示分数。例如,我在数据库中定义了 numeric(18,8)。如果用户只输入 5.234,则数据库中保存的数据为 5.23400000。我只想将其显示为 5.234

4

6 回答 6

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

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

于 2009-02-25T09:27:11.010 回答
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")

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

编辑:

顺便说一句,用循环来做到这一点:

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

优雅一些

于 2009-02-25T10:29:53.543 回答
0

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

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

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

对于小数部分 ( ) 应该可以实现相同的目标,v - int(v)但我的数学让我失败了。

于 2009-02-25T09:14:22.150 回答
0

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

于 2009-02-25T09:21:26.873 回答
0

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

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

对于 Java 1.4,请参阅此页面

于 2009-02-25T09:35:09.743 回答
0

在 Java 中:

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

我假设,您可能希望将字符串转换为双精度。

于 2009-02-26T13:46:30.863 回答