如何获得分数长度?如果可能,不使用字符串操作或循环
should all return length of 3:
5.234
5.23400
5.234000
接受任何编程语言
[编辑]
不是家庭作业,我想以最低限度显示分数。例如,我在数据库中定义了 numeric(18,8)。如果用户只输入 5.234,则数据库中保存的数据为 5.23400000。我只想将其显示为 5.234
鉴于您关心的是显示而不是内部表示,为什么不直接去掉尾随的 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";
您可能可以将两者优化为一个正则表达式。
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
优雅一些
对于非分数部分,长度为:
int((ln(v)/ln(10))+.999)
只要 v > 1,其中 ln() 是自然对数并且 int() 总是向下舍入。对于 v == 1,ln(v) 返回 0,因此您必须在特殊情况下处理此问题。
对于小数部分 ( ) 应该可以实现相同的目标,v - int(v)
但我的数学让我失败了。
只需实现除法算法。当数字计数 > 7 或 8 位时停止(对于 float32)
使用 Java 和 JDBC 时,通过ResultSet.getBigDecimal()获取值。要获得正确的比例,请使用以下代码(Java 5 及更高版本;Java 1.4 中有一个错误导致“0.0”失败):
int precision = v.stripTrailingZeros().scale();
对于 Java 1.4,请参阅此页面。
在 Java 中:
Double.valueOf("5.34000").toString();
我假设,您可能希望将字符串转换为双精度。