我想计算存储在tcl列表P中的数字列表的平均值。这是我的脚本:
set sum 0.0
foreach e $P { set sum [expr {$sum + $e}] }
set avg [expr {1.0*$sum / [llength $P]}]
但我有错误:can't use non-numeric string as operand of "+"
我该怎么办?
答案 0 :(得分:2)
您的问题可能是由于P
中的某些元素不是数字。无论如何,这就是你计算平均值的方法:
package require math::statistics
::math::statistics::mean $P
假设P
是一个数字列表。
如果你有一个数据项列表,并想知道它们中的任何一个是否不适合expr
算术,你可以这样做:
foreach n $data {
if {![string is double -strict $n]} {
error "$n is not a number"
}
}
这将报告第一个非号码。 string is double
命令识别整数和浮点数 1 。如果省略-strict
标志,空字符串将被视为一个数字(expr
仍然会阻塞它,但 2 )。
这将为您提供$data
中所有非数字项的子列表:
lmap n $data {
if {![string is double -strict $n]} {set n} continue
}
这将为您提供$data
中所有正确数字项的子列表:
lmap n $data {
if {[string is double -strict $n]} {set n} continue
}
<小时/> 1 名称“double”表示对于任何可以转换为C数据类型
double
的字符串,它返回true,后者特指存储双精度浮点数number ,(编码浮点数的行业标准)。如果你不知道那是什么,你可以假装它意味着加倍,因为“看起来像整数的数字和看起来像实数的数字”。
2 expr
也会阻塞值NaN
这是一个完全有效的浮点值,它只代表“不是数字”。
文档:continue,error,expr,foreach,if,lmap,math::statistics包,{{ 3}},package,set