tcl格式化固定精度浮点
结果:6.25e-07tcl格式化固定精度浮点,tcl,Tcl,结果:6.25e-07 有没有办法强迫tcl获得像625e-09这样的结果?我认为format命令中没有任何东西可以直接帮助您。但是,如果您考虑格式代码上的微小变化,那么获得想要的东西(使用字符串操作位)可能会容易得多: 给出如下数字:6.25000e-007 这可以更容易地解析: 提取指数 确定要移动小数点的位置数 移动它并替换指数 恐怕这并不完全是直截了当的,但应该是可行的。Wiki页面可能会给您一些启发。假设您希望将其格式化为最接近的指数,您可以使用proc将其格式化如下: forma
有没有办法强迫tcl获得像625e-09这样的结果?我认为format命令中没有任何东西可以直接帮助您。但是,如果您考虑格式代码上的微小变化,那么获得想要的东西(使用字符串操作位)可能会容易得多: 给出如下数字:
6.25000e-007
这可以更容易地解析:
- 提取指数
- 确定要移动小数点的位置数
- 移动它并替换指数
恐怕这并不完全是直截了当的,但应该是可行的。Wiki页面可能会给您一些启发。假设您希望将其格式化为最接近的指数,您可以使用
proc
将其格式化如下:
format %#3.6g $number
proc fix\u sci{n}{
#不是指数为负的sci fmt编号
如果{![字符串匹配“*e-*”$n]}{返回$n}
#指数集
设定一个9
b组12
#抓取数字(我称之为“front”)和指数(称为“exp”)
regexp--{(-?[0-9.]+)e-0*([0-9]+)}$n-front exp
#检查哪一组指数更接近数字的指数
如果{[expr{abs($exp-$a)}]<[expr{abs($exp-$b)}]}{
#如果是第一个,获取差异并调整“前”
set dif[expr{$exp-$a}]
设置前端[expr{$front/(10.0**$dif)}]
设置exp$a
}否则{
#如果是第一个,获取差异并调整“前”
set dif[expr{$exp-$b}]
设置前端[expr{$front/(10.0**$dif)}]
设置exp$b
}
#返回格式化的数字,前面最多3位,指数最多2位
返回[格式%3ge-%.2d$front$exp]
}
请注意,原始代码返回6.25e-007
(指数中有3位数字)
如果需要更改规则或四舍五入指数,则必须更改If
部分(即[expr{abs($exp-$a)}]<[expr{abs($exp-$b)}]
)。例如,如果指数为9或更低,则可以使用$exp>=$a
进行格式化
以上代码的“最近”指数
对于8.5之前的Tcl版本,使用
pow(10.0,$dif)
而不是10.0**$dif
我想在e-09或e-12A中产生某种工程符号?好问题;我想不出任何简单的事情(今天剩下的时间我就要失去互联网了,所以我想不出更复杂的事情了……)如果你得到结果会发生什么?它应该成为e-09
还是e-12
?(基本上,总是向上或向下取整指数,或者最接近的指数?实际上这两者对我来说都是可以接受的,没有区别,我想在e-09或e-12中得到结果。(假设总是得到e-09)@TigranKhachikyan真棒!同时,也看到了你的其他评论。你可以简化它,只使用if
的一部分,并选择你需要的一部分(如果你需要这两个部分中的任何一个,可以选择a
或b
)。
format %#3.6g $number
proc fix_sci {n} {
# Not a sci-fmt number with negative exponent
if {![string match "*e-*" $n]} {return $n}
# The set of exponents
set a 9
set b 12
# Grab the number (I called it 'front') and the exponent (called 'exp')
regexp -- {(-?[0-9.]+)e-0*([0-9]+)} $n - front exp
# Check which set of exponent is closer to the exponent of the number
if {[expr {abs($exp-$a)}] < [expr {abs($exp-$b)}]} {
# If it's the first, get the difference and adjust 'front'
set dif [expr {$exp-$a}]
set front [expr {$front/(10.0**$dif)}]
set exp $a
} else {
# If it's the first, get the difference and adjust 'front'
set dif [expr {$exp-$b}]
set front [expr {$front/(10.0**$dif)}]
set exp $b
}
# Return the formatted numbers, front in max 3 digits and exponent in 2 digits
return [format %3ge-%.2d $front $exp]
}