Tcl在求和时出错

Tcl在求和时出错,tcl,Tcl,我想计算tcl list p中存储的数字列表的平均值。以下是我的脚本: set sum 0.0 foreach e $P { set sum [expr {$sum + $e}] } set avg [expr {1.0*$sum / [llength $P]}] 但是我有一个错误:不能使用非数字字符串作为“+”的操作数。 我怎么算数 您的问题可能是由于p中的某些元素不是数字。在任何情况下,这是计算平均值的方法: package require math::statistics ::math:

我想计算tcl list p中存储的数字列表的平均值。以下是我的脚本:

set sum 0.0
foreach e $P { set sum [expr {$sum + $e}] }
set avg [expr {1.0*$sum / [llength $P]}]
但是我有一个错误:
不能使用非数字字符串作为“+”的操作数。

我怎么算数

您的问题可能是由于
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"
    }
}
这将报告第一个非数字。
字符串是双精度的
命令可识别整数和浮点数1。如果省略
-strict
标志,则空字符串将被视为一个数字(
expr
仍将阻塞它,尽管2)

这将为您提供
$data
中所有非数字项的子列表:

lmap n $data { 
    if {![string is double -strict $n]} {set n} continue
}
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
}
lmap n $data { 
    if {[string is double -strict $n]} {set n} continue
}

1名称“double”表示对于任何可以转换为C数据类型的字符串,它都返回true
double
,具体指双精度浮点数的存储(用于编码浮点数的行业标准)。如果你不知道那是什么,你可以假装它的意思是“看起来像整数的数字和看起来像实数的数字”

2
expr
还将阻塞值
NaN
,这是一个完全有效的浮点值,它只是代表“不是数字”


文档:,,,包,,

什么是p?假定没有正确格式化的数字供解释器理解为数字。如果{[catch{set sum[expr{$sum+$e}]}{put“$e不是一个数字”}在循环中而不是在当前行中,您可以使用
?事实上,我在P中有非数字元素@爸爸,别忘了接受这个答案: