- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我最近询问了 System.Double
,并被告知计算可能因平台/架构而异。不幸的是,我找不到任何信息来告诉我这是否适用于 System.Decimal
。
对于任何特定的 decimal
计算,无论平台/架构如何,我都能保证完全得到相同的结果吗?
最佳答案
Am I guaranteed to get exactly the same result for any particular decimal computation independently of platform/architecture?
C# 4 规范 明确指出,您获得的值 在任何平台上的计算都是相同的。
正如 LukeH 的回答指出的那样,C# 2 规范的 ECMA 版本为一致性实现提供了余地以提供更高的精度,因此在另一个平台上实现 C# 2.0 可能会提供更高精度的答案。
为了这个答案的目的,我将只讨论 C# 4.0 指定的行为。
C# 4.0 规范说:
The result of an operation on values of type decimal is that which would result from calculating an exact result (preserving scale, as defined for each operator) and then rounding to fit the representation. Results are rounded to the nearest representable value, and, when a result is equally close to two representable values, to the value that has an even number in the least significant digit position [...]. A zero result always has a sign of 0 and a scale of 0.
由于操作的精确值的计算在任何平台上都应该相同,并且舍入算法定义明确,因此无论平台如何,结果值都应该相同。
但是,请注意关于零的括号和最后一句话。可能不清楚为什么需要该信息。
十进制系统的一个奇怪之处在于几乎每个数量都有不止一种可能的表示形式。考虑精确值 123.456。小数是 96 位整数、1 位符号和表示从 -28 到 28 之间的数字的八位指数的组合。这意味着精确值 123.456 可以用小数 123456 x 10- 3 或 1234560 x 10-4 或 12345600 x 10-5。 规模很重要。
C# 规范还规定了如何计算比例信息。文字 123.456m 将被编码为 123456 x 10-3,而 123.4560m 将被编码为1234560 x 10-4。
观察此功能的实际效果:
decimal d1 = 111.111000m;
decimal d2 = 111.111m;
decimal d3 = d1 + d1;
decimal d4 = d2 + d2;
decimal d5 = d1 + d2;
Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);
Console.WriteLine(d4);
Console.WriteLine(d5);
Console.WriteLine(d3 == d4);
Console.WriteLine(d4 == d5);
Console.WriteLine(d5 == d3);
这产生
111.111000
111.111
222.222000
222.222
222.222000
True
True
True
请注意如何在小数运算中保留有关重要零数字的信息,并且 decimal.ToString 知道这一点并在可能的情况下显示保留的零。还要注意小数相等性如何知道根据精确值进行比较,即使这些值具有不同的二进制和字符串表示形式。
我认为规范实际上并没有说 decimal.ToString() 需要根据它们的比例正确地打印出带有尾随零的值,但如果不这样做,实现将是愚蠢的;我会认为这是一个错误。
我还注意到CLR实现中小数的内部存储格式是128位,分割为:16个未使用位,8个比例位,7个未使用位,1个符号位和96个尾数位。这些位在内存中的确切布局未由规范定义,如果另一个实现想要将其他信息填充到这 23 个未使用的位中以用于其自己的目的,它可以这样做。在 CLR 实现中,未使用的位应该始终为零。
关于c# - .NET “decimal” 算法是否独立于平台/体系结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018187/
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我遇到了这两个文档(它们是用意大利语写的,尽管代码注释是英文的): http://home.deib.polimi.it/brandole/acsocr/L13%20-%20Generic%20Ass
我的主要目标是提供一个用 jquery 编写的基于 solr 的搜索应用程序。 (不熟悉solr的,就假设它是一个可以返回搜索结果的rest api。)为了这个目标,我编写了许多小型应用程序和 ser
这个问题是关于选择“正确”类型的NoSQL数据库的,我希望甚至可以根据我将在下面列出的一些需求/用例以及当前正在使用的传统RDBMS解决方案,讨论特定的数据库以及它们为什么适用。地点。时间长了一点,但
在 Java 中我运行: System.out.println(Math.log(249.0/251.0)); Output: -0.008000042667076265 在 C# 中我运行:<- 已
我目前正在考虑通过 Redux 将 Context 实现到我们的一个应用程序中,但是,我似乎找不到任何关于什么是大型应用程序的最佳结构的信息? Redux 有一个定义的方法来创建 reducer、ac
我正在使用 mailcore 框架,但收到错误消息“archtecture x86 的重复符号”以及“找不到选项的目录” 下面是错误日志。 Ld /Users/user/Library/Develop
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 11 个月前关闭。 Improve t
假设我正在从 C++ 移植代码并需要在 C# 中模拟相同的位移技术: 每当我执行位移时,我是否必须考虑架构的 Endain-ness? 最佳答案 没有。位移是一种纯粹的代数运算。它不比乘以二更依赖于平
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
关于架构 XXX 的重复符号有很多问题,但我没有得到我的问题的答案。在我的场景中,我使用 Cocoapod,并导入 FMDB,但是当我集成另一个第三方 SDK 时,当我构建项目时,出现如下错误: 是否
我无法编译我的 Xcode 项目,它有重复的 ParseFacebookUtilsV4 问题 这是我的苹果 Mach-O 链接器错误: duplicate symbol _llvm.cmdline i
我对使用 MFC 的内置文档 View 体系结构的必要性有疑问。我得到了一个基于对话框的旧项目,我必须在其中用框架替换主对话框并添加功能区。它有一种文档 View 架构,创建时没有内置类,我更愿意在新
我正在构建一个协作创作工具,该工具允许用户共同编辑信息空间,该信息空间是节点和链接的可视化。一个客户端应用程序中所做的更改需要反映到所有其他客户端中。由于它是可视化的,因此可能需要经常更新潜在的大数据
如果我在 Windows(x86 和 x64)下的 .NET 上运行涉及 System.Double 的复杂计算,然后在 Mono(Linux、Unix 等)上运行,绝对有保证 以在所有情况下得到完全
当我使用 Xcode 4.6 编译我的 iPhone 应用程序时,我看到一个奇怪的错误代码: "duplicate symbols for architecture i386". 我知道这个关于文件名
我最近询问了 System.Double,并被告知计算可能因平台/架构而异。不幸的是,我找不到任何信息来告诉我这是否适用于 System.Decimal。 对于任何特定的 decimal 计算,无论平
我有一些实体,例如:Customers、Orders、Invoices。 对于它们中的每一个,我都将它们的CRUD 操作 和一些其他界面分组为:ISvcCustomerMgmt、ISvcOrderMg
这个问题有点像一个池。我们正在尝试在使用 LINQ to SQL 之类的 ORM 时确定最佳架构。我们正在定义的架构是用于其他应用程序将通过直接引用 DLL 或通过 Web 服务访问的框架。我们有 .
请就如何为 Java web 应用程序做“插件”架构提出建议。 目前我们在 Tomcat servlet 容器中使用非常简单和标准的 Spring+Hibernate+Struts 2。 (使用 ma
我是一名优秀的程序员,十分优秀!