最近在用.net写朴素贝叶斯算法时,发现所有关于Math的函数参数值类型都为double,这样在进行浮点运算时精度无法得到保证。需要转为decimal。总结方法如下:
<span style="font-size:14px;">for(int j=0;j<featuresinput.Count;j++)
{
decimal Gaosi;
if (CalFeatureVar[j] == 0.0)
{
Gaosi = 1.0m;
CP.Add(Gaosi);
}
else
{
Gaosi = Convert.ToDecimal(Math.Log((1.0 / Math.Sqrt(2.0 * Math.PI * CalFeatureVar[j])))) + Convert.ToDecimal(-(1.0 / 2.0 * Math.Pow((featuresinput[j] - CalFeatureAvr[j]), 2.0)/ CalFeatureVar[j]));//math.exp小心为1和为0的情况
CP.Add(Gaosi);
}
}</span>
附:math类用法
Math 方法:
- Acos:返回余弦值为指定数字的角度。
- Asin:返回正弦值为指定数字的角度。
- Atan:返回正切值为指定数字的角度。
- Atan2:返回正切值为两个指定数字的商的角度。
- Cos:返回指定角度的余弦值。
- Sin:返回指定角度的正弦值。
- Tan:返回指定角度的正切值。
- Abs:返回指定数字的绝对值。
- Ceiling:返回大于或等于指定数字的最小整数。
- Floor:返回小于或等于指定数字的最大整数。
- Round:将值舍入到接近的整数或指定的小数位数
-
- Round(Double):四舍五入。
- Round(Double, Int32):四舍五入,小数位数。
- Round(Double, MidpointRounding)
- Round(Double, Int32, MidpointRounding)
- MidpointRounding.ToEven:舍入最接近的偶数。 2.5 → 2
- MidpointRounding.AwayFromZero:舍入绝对值较大的值。 2.5 → 3
- Exp:返回e的指定次幂。
- Pow:返回指定数字的指定次幂。
- Log10:返回指定数字以10为低的对数。
- Log:返回指定数字的对数。
-
- Log(Double):返回指定数字的自然对数(底为e)。
- Log(Double, Double):返回指定数字在使用指定底数时的对数。
- Log(1000, 10) = 3 底数写在后面。
- Max:返回两个指定数字中较大的一个。
- Min:返回两个指定数字中较小的一个。
- Sqrt:返回指定数字的平方根。
- Truncate:计算一个数字的整数部分。
Math 字段:
- E:表示自然对数的底,它由常数e指定。
- PI:表示圆的周长与其直径的比值。