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,开关不会改变,但是标题文本的颜色会突然改变。 我怎样才能正确地做呢?