当前位置: 首页 > 面试题库 >

如何以正确的方式将float64数字更改为uint64?

魏凯捷
2023-03-14
问题内容
package main

func main() {
    var n float64 = 6161047830682206209
    println(uint64(n))
}

输出将是:

6161047830682206208

看起来,当float64更改uint64为时,分数将被丢弃。


问题答案:

这里的问题是常量和浮点数的表示形式。

常数以任意精度表示。浮点数使用IEEE
754
标准表示。

规格:常数:

数字常数表示任意精度的值,并且不会溢出。

规格:数值类型:

float64     the set of all IEEE-754 64-bit floating-point numbers

在IEEE 754中,使用64位(float64在Go中)的 53位
双精度用于存储数字。这意味着可以表示的最大位数(最大位数)是其中的位数2<<52(1位表示符号):

2<<52        : 9007199254740992
Your constant: 6161047830682206209

精确到15.95位数字(16位数字,但不是您可以用16位数字描述的所有值,最多不超过9007199254740992)。

您尝试放入类型变量的整数常量float64根本 无法容纳 52位,因此必须四舍五入,并且数字(或位)将被截断(丢失)。

您可以通过打印原始n float64号码来进行验证:

var n float64 = 6161047830682206209
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

输出:

6161047830682206208.000000
6161047830682206208

问题不在于转换,问题在于float64您尝试转换的值已经不等于您尝试为其分配的常数。

出于好奇:

使用更大的数字尝试相同的操作:与第一个const相比,+ 500:

n = 6161047830682206709 // +500 compared to first!
fmt.Printf("%f\n", n2)
fmt.Printf("%d\n", uint64(n2))

输出 仍然 相同(最后一位/位被截断,包括+500!):

6161047830682206208.000000
6161047830682206208

尝试使用一个较小的数字,该数字可以使用52位(小于16位数字)精确表示:

n = 7830682206209
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

输出:

7830682206209.000000
7830682206209

在Go Playground上尝试一下。



 类似资料:
  • 问题内容: 如何将2.5E7更改为2,500,000.00? 问题答案: 尝试: 看这里 如果您尝试解析2.5E7,则可以执行此操作

  • 问题内容: 我想将数据框的索引(行)从float64更改为字符串或unicode。 我认为这会起作用,但显然不会: 错误信息: 问题答案: 您可以这样操作: 至于为什么将处理方式从int转换为float的原因不同,那就是numpy的特殊性(pandas所基于的库)。 每个numpy数组都有一个 dtype ,它基本上是其元素的 机器 类型:以这种方式, numpy直接处理本机类型 ,而不处理Pyt

  • 我有应用程序,以自定义字体样式生成报告,如字体家族,颜色,大小和样式(粗体,斜体,下划线)。我使用Windows系统中的所有字体族。

  • 问题内容: 我正在使用React 和开发一个多语言应用程序。 我通过以下方式初始化i18next: 而且我实现了一个语言选择器,该选择器仅将中的值更改为用户选择的值。 这是正确的做法吗? 我问,因为即使这可行,但我仍然感觉自己在通过设置进行“欺骗”,并且我没有按原样使用语言检测。 问题答案: 根据文档,您不需要自己指定语言: 而根据这片源中,它的确使用了插件的检测能力: 这是正确的做法吗? 所以,

  • 问题内容: 我一直在努力,但是我不明白。我是编程新手,所以几乎每个新步骤都是一个实验。尽管在没有参数/返回值的情况下调度正常的闭包没有问题,但到目前为止,我还不了解如何处理带有(多个)参数并最终返​​回的函数。 为了弄清楚适当的“解决方法”的逻辑,如果有人可以发布一个实际的示例,这样我就可以确定自己是否正确,那就太好了。我将非常感谢您提供的任何帮助…如果其他一些实际示例以更好的方式说明了该主题,请

  • 我想要一个首选项标题的文本,以便在另一个首选项(a)更改时将其颜色更改为白色。当另一个首选项被更改时,我将从侦听器调用此方法: 现在有两种情况: 1) 如果我在方法中返回true,则的开关将正确更改(意味着在启用或禁用的新状态下向左或向右滑动),但受影响首选项的标题颜色不会更改。 2) 如果我在首选项更改中返回false,开关不会改变,但是标题文本的颜色会突然改变。 我怎样才能正确地做呢?