问题标签 [rounding-error]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
floating-point - 浮点数是如何存储的?什么时候重要?
在跟进这个问题时,似乎有些数字根本不能用浮点表示,而是近似的。
浮点数是如何存储的?
不同尺寸是否有共同标准?
如果我使用浮点数,我需要注意哪些问题?
它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?
vb.net - 如何处理 vb.net 中双精度数的舍入错误?
我正在尝试使用 vb.net 平衡一组货币价值。这两个值的总和被转换为双精度值。在某些情况下,我会遇到舍入错误。
避免这种情况的最佳方法是什么?有没有一种我可以优先使用的类型?如何将结果值四舍五入到小数点后两位?
这是我的代码——我可能不需要展示它,但以防万一。
numerical-analysis - 如何在特定机器上找到尾数长度?
我想在特定计算机上找到尾数位数和单位舍入。我了解这些是什么,只是不知道如何找到它们-尽管我知道它们可能因计算机而异。
我需要这个数字来执行数值分析的某些方面,比如分析错误。
我目前在想的是,我可以编写一个小的 c++ 程序来缓慢递增一个数字,直到发生溢出,但我不确定要使用什么类型的数字。
我在正确的轨道上吗?究竟如何计算这个?
java - 如何处理接近1的数字的乘法
我有一堆浮点数(Java 双精度数),其中大部分非常接近 1,我需要将它们相乘作为更大计算的一部分。我需要做很多。
问题是,虽然 Java 的双打对像这样的数字没有问题:
他们不能代表类似的东西:
因此,我迅速失去了精度(Java 的双打的限制似乎在 1.000000000000001 左右)。
我考虑过只存储减去 1 的数字,因此例如 1.0001 将存储为 0.0001 - 但问题是再次将它们相乘我必须加 1,此时我失去了精度。
为了解决这个问题,我可以使用 BigDecimals 来执行计算(转换为 BigDecimal,加 1.0,然后相乘),然后再转换回双精度数,但我非常担心这会对性能产生影响。
任何人都可以看到避免使用 BigDecimal 的方法吗?
为清楚起见进行编辑:这是针对采用梯度下降优化算法的大规模协同过滤器。准确性是一个问题,因为协同过滤器通常处理非常小的数字(例如,一个人点击产品广告的概率,可能是千分之一,或万分之一)。
速度是一个问题,因为协同过滤器必须在数千万个数据点上进行训练,如果不是更多的话。
php - php intval() 和 floor() 返回值是否太低?
因为 PHP 中的浮点数据类型不准确,并且 MySQL 中的 FLOAT 占用的空间比 INT 多(并且不准确),所以我总是将价格存储为 INT,在存储之前乘以 100 以确保我们有 2 个小数位的精度. 但是我相信 PHP 行为不端。示例代码:
产生的输出:
我很惊讶。当最终结果比预期低 1 时,我希望测试的输出看起来更像:
这将证明浮点类型的不准确性。但是为什么 floor(115) 返回 114?
python - 什么类用于货币表示?
我应该使用什么类来表示货币以避免大多数舍入错误?
我应该使用Decimal
,还是简单的内置number
?
有没有Money
我可以使用的支持货币转换的现有课程?
我应该避免的任何陷阱?
sql - sql和clr中舍入的区别
我已经搜索并找不到答案。我仔细检查了 SQL 和 CLR 之间的数据类型,我似乎是正确的。但是我在使用 CLR 和 SQL 之间得到了不同的结果。不多,但足够花一分钱。这是不可接受的。
VB.NET 中的示例
将显示 1476.34499999999
SQL 中的示例
返回 1476.345000000000000
对于一些文件我们必须使用VB,但是对于一些文件传输我们使用sql。任何人有任何建议这是为什么?
干杯
鲍勃
gdi - 指定 GDI 设备上下文的 DPI
我有一个生成元文件(EMF)的应用程序。它使用参考设备(又名屏幕)来渲染这些元文件,因此元文件的 DPI 会根据代码运行的机器而变化。
假设我的代码打算创建一个 8.5 英寸 x 11 英寸的元文件。使用我的开发工作站作为参考,我最终得到一个具有
- { 0, 0, 21590, 27940 } 的 rclFrame(元文件的尺寸,以千分之一毫米为单位)
- { 1440, 900 } 的 szlDevice(参考设备的尺寸,以像素为单位)
- { 416, 260 } 的 szlMilimeters(参考设备的尺寸,单位为 mm)
好的,所以 rclFrame 告诉我 EMF 的大小应该是
- 21590 / 2540 = 8.5 英寸宽
- 27940 / 2540 = 11 英寸高
对了。使用这些信息,如果我的数学是正确的,我们也可以确定我的显示器的物理 DPI:
- (1440 * 25.4) / 416 = 87.9231 水平 dpi
- (900 * 25.4) / 260 = 87.9231 垂直 dpi
问题
任何播放此元文件的东西——EMF 到 PDF 的转换、在 Windows 资源管理器中右键单击 EMF 时的“摘要”页面等——似乎都会截断计算的 DPI 值,显示 87 而不是 87.9231(甚至88就好了)。
这会导致在播放元文件时页面的物理尺寸为 8.48 in x 10.98 in(使用 87 dpi)而不是 8.5 in x 11 in(使用 88 dpi)。
- 是否可以更改参考设备的 DPI,以便存储在用于计算 DPI 的元文件中的信息变成一个很好的整数?
- 我可以创建自己的设备上下文并指定其 DPI 吗?还是我真的必须使用打印机才能做到这一点?
感谢您的任何见解。
c++ - 用 C++ 表示概率
我试图在 C++ 中表示一组简单的 3 个概率。例如:
(据我所知概率必须加起来为 1)
我的问题是,当我尝试将 C++ 中的 0.7 表示为浮点数时,我最终得到 0.69999999,这在我稍后进行计算时无济于事。对于 0.8、0.80000001 也是如此。
有没有更好的方法在 C++ 中表示 0.0 和 1.0 之间的数字?
请记住,这与数字如何存储在内存中有关,因此在对它们正确的值进行测试时,我不关心它们是如何显示/打印出来的。
c# - ToString("f2") 中的 .NET 舍入错误
您好,我在 C# 中有这段代码:
而这段 C++ 代码:
第一个输出3.00。
第二个输出2.99。
我不知道为什么会这样。
更新:
我还尝试了 Objective-C NSLog,输出为2.99。
我需要快速修复它,所以我使用了以下方法:
此代码显示2.99,但以双精度计算舍入。我找不到 Math.RoundF。