- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想以比默认值更高的精度打印 float 。
例如,当我从 float 打印 PI 的值时,我得到 6 位小数。但是,如果我将相同的值从 float 复制到 double 并打印它,我会得到 14 位小数。
为什么打印相同的值但作为 double 值时精度更高?
如何让 Console.WriteLine() 在打印 float 时输出更多小数而不需要先将其复制为 double 值?
我也试过 0.0000000000 但它并没有写得更精确,它只是添加了更多的零。 :-/
我的测试代码:
float x = (float)Math.PI;
double xx = x;
Console.WriteLine(x);
Console.WriteLine(xx);
Console.WriteLine($"{x,18:0.0000000000}"); // Try to force more precision
Console.WriteLine($"{xx,18:0.0000000000}");
输出:
3,141593
3,14159274101257
3,1415930000 <-- The program just added more zeroes :-(
3,1415927410
我还尝试在 https://www.h-schmidt.net/FloatConverter/IEEE754.html 输入 PI
PI的二进制 float 表示为0b01000000010010010000111111011011
因此值为:2 * 0b1.10010010000111111011011 = 2 * 1.57079637050628662109375 = 3.1415927410125732421875
所以有更多的小数可以输出。我如何让 C# 输出整个值?
最佳答案
float 不再精确。当您将其转换为 double
时,精度更差,即使精度(位数)增加了 - 基本上,您在 double print 中看到的所有额外数字是转换工件 - 它们错误,只是您可以在 double 中获得的给定 float 的最佳表示。这与二进制 float 的工作原理息息相关。
让我们看一下 float 的二进制表示:
01000000010010010000111111011100
第一位是符号,接下来的八位是指数,剩下的是尾数。当我们将它转换为 double 时我们会得到什么?指数保持不变,但尾数用零填充。但这实际上改变了数字 - 你得到 3.1415929794311523
(四舍五入,与二进制 float 一样)而不是正确的 3.14159265358979
pi 的 double 值。您会产生精度更高的错觉,但这只是错觉 - 数字并不比以前更准确,您只是用噪声替换了零。
float 和 double 之间没有 1:1 的映射。相同的 float 值可以由许多不同的 double 值表示,数字的十进制表示也可以相应变化。如果您关心小数精度,则每次将 float
转换为 double
后都应进行舍入操作。请考虑以下代码:
double.Parse(((float)Math.PI).ToString())
我没有将 float 转换为 double ,而是首先将其更改为十进制表示形式(在字符串中),并从中创建了 double 。现在,您拥有的不是“截断的” double ,而是一个不存在额外精度的适当 double ;当你打印出来时,你会得到 3.1415930000
。当然,仍然是四舍五入,因为它仍然是二进制 -> 十进制转换,但不再假装比实际精度更高 - 四舍五入发生在比浮点版本更晚的数字,零是真的 零,除了最后一个(仅近似为零)。
如果您想要真正的小数精度,您可能需要使用小数类型(例如 int
或 decimal
)。 float
和double
都是二进制 数,并且只有二进制精度。有限十进制数在二进制中不一定是有限的,就像有限三进制数在十进制中不一定是有限的(例如 1/3 没有有限十进制表示法)。
关于c# 更精确地打印浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42646654/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!