gpt4 book ai didi

.net - 通过 .NET 远程处理传输后更改了 double 值

转载 作者:行者123 更新时间:2023-12-05 00:41:22 26 4
gpt4 key购买 nike

我有一个应用程序,它结合了远程处理(客户端/服务器架构,通过远程处理传输数据集)使用 ADO.NET 数据集和数据适配器。

我现在面临以下问题:

TL;DR:双倍值 44.850000925362000变成 44.850000925362004通过远程发送数据集到服务器后。

我通过保存数据集在数据库中创建一个新行,其中包含一个浮点列(映射到数据集中的 double )。保存的 double 值是 44.850000925362
然后我从数据库中读取这一行( DataAdapter.Fill )并获得相同的值(用 BitConverter.DoubleToInt64 检查)。该数据集通过远程处理传递到客户端,然后合并到客户端上的用例数据集。仍然保留相同的值。

然后这个数据集被合并到一个用例数据集中,其中的行被导入到一个不同的表中(因为从 View 中读取,保存到表中)并且在传输用例数据集之前更改了一个值(现在包含一个行其他表)。

在客户端,该值仍然相同 - 但是一旦数据集到达服务器,所涉及的值就不同(尽管没有对该特定列进行更改 - 它仍然是 Unchanged 甚至是原始值是不同的)。

例子:
保存 44.850000925362000阅读 44.850000925362000合并、导入、修改行 - 仍然 44.850000925362000发送到服务器保存,是44.850000925362004在服务器上!

...然后导致 ConcurrencyException因为记录是用 44.850000925362000 保存的- 但数据适配器更新使用 44.850000925362004WHERE条件(乐观并发)。

中间没有人碰过那排。

更新

我尝试设置一个测试服务器,一切正常。有趣的是:如果我在不同的服务中使用相同的程序集,它可以正常工作。我在配置或启动中找不到任何可以解释这一点的内容。
我在两者上都使用二进制格式化程序,两者都是 .NET 4.0,两者都使用相同的源代码......但一个行为与另一个不同。

进一步更新

我什至捕获了为更新而执行的 SQL 语句。如果我将参数作为 WHERE 运行SELECT 中的条款语句,它获取正确的记录。因此,当我手动执行此操作时(通过 SQL Management Studio),它接受行中的值和我为条件提供的值之间的小增量。
尽管如此,通过适配器运行更新时它根本不起作用。

反正我已经放弃了。我已经将它四舍五入到 5 位数字 - 无论如何,这比我在那个用例中需要的要精确得多。如果数字变大,可能会产生奇怪的结果,但我不希望在那个用例中(我们谈论的是以公斤为单位的重量)。

最佳答案

我可以告诉你这里发生了什么。不过,我不确定为什么:

如果你解释 44.850000925362000 的位和 44.8500009253620004作为 Int64,您将获得 4631508893792468976 的值和 4631508893792468977 .

如您所见,第二个值是第一个值加 1。

因此,看起来有人在某处将该 double 值解释为 Int64 然后将其递增 - 可能表明这是该行的新版本,因为您对其进行了修改。

关于.net - 通过 .NET 远程处理传输后更改了 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29948543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com