小编Jan*_*nes的帖子

C#为什么等小数会产生不等的哈希值?

我们碰到了一个神奇的十进制数字,打破了我们的哈希表.我把它归结为以下最小的情况:

decimal d0 = 295.50000000000000000000000000m;
decimal d1 = 295.5m;

Console.WriteLine("{0} == {1} : {2}", d0, d1, (d0 == d1));
Console.WriteLine("0x{0:X8} == 0x{1:X8} : {2}", d0.GetHashCode(), d1.GetHashCode()
                  , (d0.GetHashCode() == d1.GetHashCode()));
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

295.50000000000000000000000000 == 295.5 : True
0xBF8D880F == 0x40727800 : False
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是:更改,添加或删除d0中的任何数字,问题就会消失.甚至添加或删除其中一个尾随零!这个标志似乎并不重要.

我们的解决方法是将值除去以消除尾随零,如下所示:

decimal d0 = 295.50000000000000000000000000m / 1.000000000000000000000000000000000m;
Run Code Online (Sandbox Code Playgroud)

但我的问题是,C#怎么做错了?

.net c# hash decimal

42
推荐指数
1
解决办法
2968
查看次数

从.vdproj构建没有Devenv的合并模块

我读了几个关于通过命令行构建mergemodules的Stackoverflow问题,但当有人建议使用devenv进行编译或使用Dark从现有的msi文件创建wix文件时,所有这些都被接受了.

考虑以下因素:

  • VisualStudio未安装在我必须使用的构建服务器上.
  • 我正在使用nant + msbuild来编译解决方案
  • 我想从.vdproj编译mergemodules(因为Visual Studio会自动检测依赖项)
  • 并从多个mergemodules创建一个msi设置

...如何在没有devenv的情况下从命令行构建合并模块,并且不会失去在visualstudio中为mergemodule解析自动化依赖关系的舒适度?也许有一个我没有找到它的nanttask?

msbuild nant vdproj merge-module devenv

5
推荐指数
1
解决办法
4081
查看次数

标签 统计

.net ×1

c# ×1

decimal ×1

devenv ×1

hash ×1

merge-module ×1

msbuild ×1

nant ×1

vdproj ×1