浮点-如何确定用户输入的数字在C#中存储为Single时是否会被误传
本文关键字:Single 存储 是否 何确定 用户 输入 数字 浮点 | 更新日期: 2023-09-27 17:58:08
我有一个用户将修改的数据网格。一列存储一个单精度浮点。当用户输入一个超过7位数的数字时,该数字将以科学记数法显示,与该数字的比较将变得非常不准确。我想提醒用户,当这种情况发生时,号码只会被存储得很近。有什么方法可以确定一个数字何时能正确存储在一个单曲中吗?截止数字似乎是7位数左右。任何超过这一点的事情都是不可能的。
我认为您需要对每个单元格进行验证。
逐步解释:
通过设计器或代码将CellValidating事件添加到DataGridView:
dataGridView1.CellValidating+=dataGridView1_CellValidating;
检查你想要这样:
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
double value = 0;
if (double.TryParse(e.FormattedValue.ToString(), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out value))
{
dataGridView1[e.ColumnIndex, e.RowIndex].ErrorText = "";
// e.Cancel = false;
}
else
{
dataGridView1[e.ColumnIndex, e.RowIndex].ErrorText = "Bad Input Please Correct It !";
// e.Cancel = true; if you do this the datagrid dont let user go next row
}
}
如果你想纠正你自己的价值,也要做以下步骤:
也添加CellValidated事件:
dataGridView1.CellValidated+=dataGridView1_CellValidated;
检查一下:
private void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1[e.ColumnIndex, e.RowIndex].Value == null)
return;
double value = 0;
if (double.TryParse(dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString(), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out value))
{
dataGridView1[e.ColumnIndex, e.RowIndex].Value = Math.Round(value, 2).ToString().Replace("/",".");
}
}
注意:如果要在特殊单元格上进行编辑,则每次编辑单元格时都会发生此事件。请在引发事件之前进行检查。您可以为每列设置最大输入长度,以避免错误输入。
您可以通过解析输入并将其返回为string
:来进行自我检查
string s = "0.12345678";
return Single.Parse(s).ToString() == s;
在float
或double
中存储任何数字的那一秒,假设它不再是100%准确的,因为很可能不是。当你对这个数字执行任何运算的那一秒,特别是如果它不是加法/减法,你可以相当肯定地确定存在一些错误。如果你想确切地知道它们的误差有多大,那么你就开始进入一些相当复杂的数学。