这是一个尴尬的错误,我们已经在ASP.NET MVC 3应用程序中使用了。我认为它很可能是我们代码中的一些错误(它仍然可能存在),但我无法找到任何迹象。
这里发生了什么:
当用户在特定表单中输入数字N
时,该表单中的不同字段,以便N > 1,000
将数字除以1,000并四舍五入到最接近的整数。例如,35,686将成为36,但35,423将成为35.到目前为止,这只发生了两次,在两周之内,尽管用户每天都使用这种特殊形式。再次输入数字,接管正确的数字。
细节:
用户键入,例如35686
(没有任何分隔符),在大约100个案例中,36
中存储35686
而不是35.686
。最奇怪的是,它变得圆润。通常会输出一个双重值,例如35
只会截断十进制数字并导致35.686
。
由于我们的用户大多使用我们认为的德国文化,有人写了.
(,
是德国千位分隔符)并且它被转换为整数。但是,当我们测试它时,无论我们使用何种语言文化(英语和德语)以及任何分隔符(.
和Math.Round
),这都不会导致四舍五入(或者它会)。我们总是从服务器上得到一个异常,表示该号码应该没有分隔符。
检查应用程序时,C#代码中不会出现Round
,round
或0.5
,也不会出现JS代码。我也找不到任何+0.5
(将double舍入到最接近的整数的最简单方法是hns = [[a,b,c],[c,b,a],[b,a,c]]
并转换为int)。我也没有找到任何除法。
我们可能错过了什么吗?我们的用户使用的浏览器是带有Windows 7的IE 11.该应用程序在IIS上最新版本的.Net上运行在Windows Server 2012上。你有什么想法吗?
澄清:
正如我所说,到目前为止,错误只发生了两次,我们无论如何都无法重现它。虽然JavaScript使用数字来计算和显示表单旁边的其他值,但表单本身最终只是作为HTML提交。这个表单周围的整个代码非常大> 1k LOC,因为我们无法重现它,所以我们无法共享可能有助于发现错误的特定部分。但是在C#类中,类型是整数。那么转换应该发生在浏览器或中间件的某个地方?