问题标签 [floating-point-conversion]
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.
java-7 - 为什么 java 7 123.123456f 会得到 123.12346?
我正在使用 Java 7 64 位开发 LibGDX 程序。
当我使用 junit 测试一个接收浮点数作为参数的函数时,我得到了一个奇怪的结果。我使用123.123456f
作为参数调用函数,函数接收123.12346
. 为什么会这样?
当我12.123456f
用作参数时,它得到了正确的结果。
123.12345f
仍然有效。
因此我System.out.println(...)
用来检查输入。
这对我来说并不重要,但我只想知道为什么。非常感谢你!
问候,安东尼
java - 如何使用 Java 将字符串逐个字符转换为浮点数?
前段时间在一次采访中被问到这个问题,我无法弄清楚。我不被允许一次全部转换,所以我的下一个想法是只运行字符串转换直到这一点,但采访我的人告诉我他想做这样的事情:
输入是convert "1234.567" to a float ie. 1234.567
老实说,我不知道他是怎么做的,我也无法编写足够好的代码来向你们展示我所拥有的只是循环解析每个字符:
c++ - 使用定点表示法将双精度转换为字符串,没有尾随零并且没有 sprintf
这个问题已经被问过几次了,但所有的答案要么是指 sprintf ,要么是涉及手动删除尾随零。真的没有更好的办法吗?不可能做到这一点std::stringstream
吗?
java - 为什么浮点数适合双精度但浮点[]不适合双精度[]?
如果我有一个以 adouble
作为参数的函数,我可以轻松地放入 a float
。
但是,当我有一个需要 a 的函数时,double[]
我无法通过 a float[]
。
php - PHP:将任何浮点数格式化为十进制扩展
我想创建一个函数formatFloat()
,它接受任何浮点数并将其格式化为十进制扩展字符串。例如:
最初的想法
简单地将浮点数转换为字符串是行不通的,因为对于大于 about1.0E+14
或小于 about的浮点数,PHP 会以科学记数法而不是十进制扩展1.0E-4
来呈现它们。
number_format()
是显而易见的 PHP 功能。但是,对于大浮点数会出现此问题:
对于小浮点数,困难在于选择要请求多少个十进制数字。一种想法是要求大量的十进制数字,然后rtrim()
是多余0
的 s。然而,这个想法是有缺陷的,因为十进制扩展通常不以0
s 结尾:
问题是浮点数的精度有限,并且通常无法存储文字的确切值(例如:)1.0E+25
。相反,它存储可以表示的最接近的可能值。 number_format()
正在揭示这些“最接近的近似值”。
Timo Frenay 的解决方案
我发现这条评论深埋在sprintf()
页面中,令人惊讶的是没有人赞成:
以下是如何打印具有 16 位有效数字的浮点数,无论大小如何:
关键部分是使用log10()
来确定浮点数的数量级,然后计算所需的小数位数。
有几个bug需要修复:
- 该代码不适用于负浮点数。
- 该代码不适用于极小的浮点数(例如:)
1.0E-100
。PHP 报告此通知:“sprintf()
:请求的 116 位精度被截断为 PHP 最大 53 位” - 如果
$value
是0.0
,那么log10($value)
是-INF
。 - 由于PHP 浮点数的精度是“大约 14 位十进制数字”,我认为应该显示 14 位有效数字而不是 16 位。
我最好的尝试
这是我想出的最好的解决方案。它基于 Timo Frenay 的解决方案,修复了错误,并使用ThiefMaster 的正则表达式来修剪多余0
的 s:
这是一个带有 200 个随机浮点数的 Ideone 演示。该代码似乎适用于所有小于 about 的浮点数1.0E+15
。
有趣的是number_format()
,即使是非常小的浮点数也能正常工作:
问题
我最好的尝试formatFloat()
仍然遇到这个问题:
有没有一种优雅的方法来改进代码来解决这个问题?
c++ - 使用 C++ 输入运算符读取浮点数
考虑
是否明确定义了此代码可以使用多少个输入字符。我对输入流的指定精度可能比类型可以表示num
的精度高得多的情况特别感兴趣。float
因此,在这种情况下,代码是否会读取所有代码(直到但不包括下一个非数字输入)或仅读取float
.
c++ - 当没有固定大小的浮点类型可用时处理浮点值的字节顺序
我正在编写一个二进制文件读取器/写入器,并决定为了处理字节序问题,我将在写入时将所有数据转换为“网络”(大)字节序,并在读取时转换为主机字节序。我正在避免hton*
,因为我不想仅仅为了这些功能而与 winsock 链接。
我的主要困惑来自如何处理浮点值。对于所有整数值,我在<cstdint>
(uint32_t
等) 中都有大小类型,但根据我的研究,浮点类型不存在这样的等价物。我想在写入时将所有浮点值转换为 32 位表示并转换回主机上使用的任何精度(32 位对于我的应用程序来说已经足够了)。这样我就可以准确地知道要为浮点值写入和读取多少字节;相反,如果我在加载文件的机器上使用sizeof(float)
并且与编写文件的机器不同。sizeof(float)
我刚刚意识到可以使用frexp
以整数形式获取尾数和指数,将这些整数写出(具有一些固定大小),然后读入整数并使用ldexp
. 这看起来很有希望,但我想知道是否有任何普遍接受或推荐的方法来处理没有htonf
/ntohf
的浮点字节序。
我几乎可以肯定地知道,我很快将瞄准的任何平台都将float
用 32 位表示,但我想让我现在编写的代码尽可能兼容,以便在未来的项目中使用。
c# - 将浮点数量化为字节的最佳方法是什么
我有一个单精度浮点值,并且没有关于生成该值的样本分布的信息,因此我无法应用 sigmoid 或执行某种归一化。另外,我知道该值将始终为非负数。将此浮点数表示为字节的最佳方法是什么?
我想到了以下几点:
将浮点数解释为 UInt32(我希望这能保持数字之间的相对顺序,如果我错了,请纠正我),然后将其缩放到一个字节的范围。
感谢您的意见和任何其他建议。谢谢!
python - 为什么平均值小于最小值,为什么这会随着 64 位浮点数而变化?
我有一个输入数组,它是一个掩码数组。
当我检查平均值时,我得到一个无意义的数字:小于报告的最小值!
所以,原始数组:numpy.mean(A) < numpy.min(A)
. 注意A.dtype
返回float32
。
修复:A3=A.astype(float)
。A3 仍然是一个掩码数组,但现在平均值介于最小值和最大值之间,所以我相信它是正确的!现在由于某种原因A3.dtype
是float64
。为什么??为什么会改变它,为什么它在 64 位是正确的,而在 32 位是完全不正确的?
任何人都可以解释为什么我需要重铸阵列以准确计算平均值吗?(事实证明,有或没有 numpy)。
编辑:我使用的是 64 位系统,所以是的,这就是重铸将其更改为 64 位的原因。事实证明,如果我对数据进行子集化(使用从 netCDF 输入中提取netCDF4 Dataset
),则没有这个问题,较小的数组不会产生这个问题 - 因此它是由溢出引起的,因此切换到 64 位可以防止这个问题。
所以我仍然不清楚为什么它最初会加载为 float32,但我猜它旨在节省空间,即使它是 64 位系统。数组本身是1872x128x256
300 左右的非屏蔽值,事实证明这足以导致溢出 :)
c++ - C++ 浮点舍入(错误?)
为什么当我使用乘法时
为什么 b 是 104.99999 而不是 105.0 ?
当我
f 是 104