double.ToString() 与 "NaN" 比较的问题

本文介绍了一个在使用Wind数据接口获取数据时遇到的问题:如何正确处理返回的double类型数据中的null和NaN值。文章详细解释了为何直接通过字符串比较判断NaN不可靠,并给出了一个跨平台的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发程序的时候遇到一个奇怪的问题。

从Wind取数据的时候,返回的是装好箱的double类型的数据。

由于Wind返回的数据存在null和NaN(对double来说)的情况,需要对数据进行清洗。


第一版程序的判断方式如下,

数据.ToString() == "NaN"    //此处数据为object{double}


发现在有些机器下可以进行有效判断,有些机器下无法判断。


原因是

在有些机器中,数据.ToString()返回的是"非数字"而不是我以为的"NaN"!!! 所以判断无法成功。


正确的写法应该是,

Double.IsNaN((double)数据)


private void button1_Click(object sender, EventArgs e) { int wz = pathname.LastIndexOf(@"\"); string pathsjtxt = pathname.Substring(0, wz + 1);//pathsjtxt是数据表路径的意思 StreamReader sr1 = new StreamReader(pathsjtxt + @"\初始数据.txt"); string strs1 = ""; while ((strs1 = sr1.ReadLine()) != null) { string[] str = strs1.Split(','); if (str[0].ToString() == "Q") { Q = double.Parse(str[1]); } if (str[0].ToString() == "H") { H = double.Parse(str[1]); } if (str[0].ToString() == "hs") { hs = double.Parse(str[1]); } if (str[0].ToString() == "b") { b = double.Parse(str[1]); } if (str[0].ToString() == "m1") { m1 = double.Parse(str[1]); } if (str[0].ToString() == "V") { V = double.Parse(str[1]); } if (str[0].ToString() == "g") { g = double.Parse(str[1]); } if (str[0].ToString() == "m") { m = double.Parse(str[1]); } } sr1.Close(); double bs = 8; N = double.Parse(textBox1.Text); const double step = 0.1;// B0每次增加0.1 const double tolerance = 1e-6;// 函数相等容差 const double maxB0 = 10000.0;// B0最大值 const double minB0 = 0;// B0最小值 double B0 = step;//从0.1开始(避免除零错误) bool solutionFound = false; double solution = double.NaN; if (textBox1.Text == "1") { while (B0 <= maxB0 && B0 >= minB0) { b0 = B0 / N; σ = Math.Round((2.31) * hs / H0 * Math.Pow((1 - hs / H0), 0.4), 3); H0 = Math.Round(H + Math.Pow(V, 2) / 2 / g, 3); double fValue = 1 - 0.171 * (1 - b0 / bs) * Math.Pow(b0 / bs, 1 / 4); double gValue = Q / (B0 * σ * m * Math.Sqrt(2 * g) * Math.Pow(H0, 3 / 2)); // 检查函数值是否在容差范围内相等 if (Math.Abs(fValue - gValue) < tolerance) { solution = B0; solutionFound = true; break; } B0 += step; B0 = Math.Round(B0, 2); // 处理浮点精度问题 } } WriteToSpecificPosition(pathsjtxt + @"\初始数据.txt", 19, 2, B0.ToString()); ε = 1 - 0.171 * (1 - b0 / bs) * Math.Pow(b0 / bs, 1 / 4); WriteToSpecificPosition(pathsjtxt + @"\初始数据.txt", 13, 2, ε.ToString()); MessageBox.Show("计算完成"); }以上代码求B0值有什么问题
最新发布
07-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值