草庐IT

C# Decimal.Epsilon

coder 2023-07-10 原文

为什么 Decimal 数据类型没有 Epsilon 字段?

From the manualdecimal 值的范围是 ±1.0 × 10e−28 到 ±7.9 × 10e28。

The description of Double.Epsilon :

Represents the smallest positive Double value greater than zero

看来,Decimal 也有这样一个(非平凡的)值。但为什么它不容易访问?

我确实知道 +1.0 × 10e−28 恰好是大于零的最小正十进制值:

decimal Decimal_Epsilon = new decimal(1, 0, 0, false, 28); //1e-28m;

顺便说一句,有几个问题提供了有关 Decimal 数据类型的内部表示的信息:

这是一个 Epsilon 有用的例子。

假设我有来自某个采样集的值的加权总和以及所采集样本的权重(或计数)总和。现在我想计算加权平均值。但我知道权重之和(或计数)可能仍为零。为了防止被零除,我可以执行 if...else... 并检查零。或者我可以这样写:

T weighted_mean = weighted_sum / (weighted_count + T.Epsilon)

这段代码在我看来比较短。或者,我也可以跳过 + T.Epsilon 并改为初始化:

T weighted_count = T.Epsilon;

当我知道实际权重的值永远不会接近 Epsilon 时,我可以这样做。

对于某些数据类型和用例,这可能更快,因为它不涉及分支。据我了解,即使分支很短,处理器也无法将两个分支都用于计算。我可能知道零以 50% 的比率随机出现 :=) 对于 Decimal,速度方面可能并不重要,但在第一种情况下甚至没有积极意义。

我的代码可能是通用的(例如,生成的),我不想为小数编写单独的代码。因此,人们希望看到 Decimal 具有与其他实值类型类似的接口(interface)。

最佳答案

与该定义相反,epsilon 实际上是一个概念,用于消除值的二进制和十进制表示之间转换的歧义。例如,十进制的 0.1 没有简单的二进制表示,因此当您将 double 声明为 0.1 时,它实际上将该值设置为二进制的近似表示。如果将该二进制表示数字与其自身相加 10 次(以数学方式),您将得到一个大约为 1.0 的数字,但不完全是。一个 epsilon 会让你在数学上胡说八道,说 0.1 的近似表示加上它自身可以被认为等同于 0.2 的近似表示。

十进制值类型不需要这种由表示的性质引起的近似值,它已经是十进制表示。这就是为什么任何时候您需要处理实际数字和本身不是近似值的数字(即金钱而不是质量)时,要使用的正确浮点类型是十进制而不是 double 。

关于C# Decimal.Epsilon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781899/

有关C# Decimal.Epsilon的更多相关文章

  1. ruby - MiniTest 的 assert_in_delta 和 assert_in_epsilon 方法有什么区别? - 2

    这里是documentationforassert_in_delta:assert_in_delta(exp,act,delta=0.001,msg=nil)publicForcomparingFloats.Failsunlessexpandactarewithindeltaofeachother.assert_in_deltaMath::PI,(22.0/7.0),0.01这里是documentationforassert_in_epsilonassert_in_epsilon(a,b,epsilon=0.001,msg=nil)publicForcomparingFloats.Fa

  2. ruby-on-rails - rails : How to print a decimal as a percent? - 2

    有没有办法将小数打印为百分比,所以只有句点后的两位数?我的小数点总是在1和0之间,所以我想从第三个字符开始调用number.round(2)是可行的,但我找不到它的语法任何地方。为了澄清,我希望将数字存储为完整的小数,但打印为百分比。 最佳答案 您可能想要使用number_to_percentage方法。来自documentation,这里有一些如何使用它的例子:number_to_percentage(100)#=>100.000%number_to_percentage("98")#=>98.000%number_to_perc

  3. ruby-on-rails - rails : remove decimal from number_to_currency - 2

    我有一个float价格:number_to_currency(m.price,:locale=>'en_us')我得到:$39.00如何删除.00,我想得到:$39 最佳答案 您可以按照记录将精度设置为0here在RailsAPI文档中。number_to_currency(m.price,locale::en,precision:0)请注意,您的价格将进行四舍五入,从38.50美元到39.49美元的任何价格都将显示为39美元。编辑:将区域设置:en_us替换为:en,这可能会在更多应用中启用。

  4. Javascript 转换 HH :MM to decimal - 2

    我有一个Javascript函数,它以HH:MM的形式给出了一天中的总工作时间。我想将这些数字转换为小数,以便将它们相加。我现在似乎遇到了错误:functiontimeToDecimal(t){t=t.split(':');return=t[0]*1+'.'parseInt(t[1])/60;}我错过了什么重要的东西吗?我只是不断收到语法错误。 最佳答案 functiontimeToDecimal(t){vararr=t.split(':');vardec=parseInt((arr[1]/6)*10,10);returnparse

  5. go - Go 中的 128 位 float - 相当于 C#'s "decimal"Type - 2

    简单的问题:是否有C#的decimal的等价物?输入Go标准库?我打算使用此类型与在某些端点返回小数的ODataAPI接口(interface),据我阅读,complex128不适合此行为(它的存储不同于花车) 最佳答案 标准库的math/big包括一个Floattype:AnonzerofiniteFloatrepresentsamulti-precisionfloatingpointnumber 关于go-Go中的128位float-相当于C#'s"decimal"Type,我们在S

  6. mysql - 如何将值插入 decimal(65,0) 并使用 Golang 从数据库中检索它们? - 2

    我对Go比较陌生。我正在使用github.com/go-sql-driver/mysql作为我的驱动程序我有一个包含许多数据类型为decimal(65,0)的列的表。我正在尝试使用big.Int来处理我的应用程序中的这些值,这对我来说似乎是合理的。但是我找不到使用Stmt.Exec将值插入数据库的方法。它说"sql:convertingargument$2type:unsupportedtypebig.Int,astruct"此外,我也找不到将它从mysql序列化回我的Go结构的方法。 最佳答案 对SQL语句使用字符串值。转换为*b

  7. xml - XML Schema (XSD) 中 decimal 类型的限制是什么? - 2

    XMLSchema中decimal类型可接受的最小值和最大值是多少?(type="xs:decimal")? 最佳答案 XMLSchema本身不会对xsd:decimal强加最小值和最大值:[Definition:]decimalrepresentsarbitraryprecisiondecimalnumbers.The·valuespace·ofdecimalisthesetofthevaluesi×10^-n,whereiandnareintegerssuchthatn>=0.[对比xsd:float,对应于IEEE单精度32位

  8. c# - 无法从 'double?' 转换为 'decimal' - 2

    我正在读取XML文件并解析信息。我正在尝试像这样将double转换为intvarpruebaPago=Math.Ceiling(row[i].Pagado);但是当我运行我的代码时,出现以下错误:cannotconvertfrom'double?'to'decimal'XML文件对Pagado的定义如下如何隐藏可空值并将其四舍五入为最接近的整数? 最佳答案 您需要使用Nullable.Value.您还需要检查该值是否不是null第一:if(row[i].Pagado.HasValue){varpruebaPago=Math.Ceil

  9. xml - 使用 XSLT 1.0 从字符串中提取数字 (+int/decimal) - 2

    我已经编写了一个XSLT代码来从字符串中提取数字字符..这是测试xml:(看起来有点奇怪,但我对XSLT的期望很高)10a08bOE9W234W30D:S10.233.23这是我尝试使用的XSLT代码:输出..10089234301023323..而且..我希望第二个标签输出像10.23323即,只允许第一个小数点.并忽略后续的..只有XSLT1.0才有可能吗?? 最佳答案 第一行的单个XPath表达式:translate(.,translate(.,'0123456789',''),'')请注意,任何非数字字符(事先不知道)将被去

  10. c# - XML 验证 : decimal attribute value starting with a space - 2

    我开发了一个小的C#脚本,它可以打开一个XLS文件,解析它并创建一个XML文件列表来验证它们XSD文件。我已尝试将这些经过验证的文件上传到第三方在线服务(为我提供文档/xsd内容的同一家公司),但一个生成的文件未被接受,因为无效.该文件不被接受,因为它在节点属性中的十进制值的开头有一个空格;删除此空格可解决问题。我创建了一个简单的测试用例,其中XDocumentValidate方法使用额外空间验证XML没有任何问题。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSys

随机推荐