go 的 `uint64` 类型无法精确表示超过 2^64−1 的整数,而 19 位十进制数(如 10736581604118680000)在转换为 `uint64` 时会因浮点近似或截断导致低 4 位偏差;应使用 `math/big.int` 或确保输入为精确字符串而非浮点近似值。
在物联网设备对接 1-Wire iButton 等硬件时,常需将厂商刻印的十六进制 ID(如 000015877CD0)与设备读取的十进制数值进行双向验证。但当十进制数达到 19 位(如 10736581604118680000)时,直接赋值给 Go 的 uint64 变量会引发静默精度丢失——这不是 Go 的 Bug,而是底层数值表示的必然限制。
根本原因在于:
✅ 正确做法:绕过 float64 和 uint64 的中间表示,全程使用精确整数运算。
package main
import (
"fmt"
"math/big"
"strconv"
)
func main() {
// ✅ 正确:从十六进制字符串直接解析(无精度损失)
hexStr := "95000015877CD001" // 厂商刻印完整值
bigInt := new(big.Int)
if _, ok := bigInt.SetString(hexStr, 16); !ok {
panic("invalid hex string")
}
// 提取中间 12 位(跳过前 2 字节 + 后 2 字节)
resultHex := fmt.Sprintf("%016X", bigInt)[2:14]
fmt.Println("Extracted ID:", resultHex) // 输出:000015877CD0
// ✅ 或从十进制字符串安全解析(若必须用 dec 输入)
decStr := "10736581604118679553" // 注意:这是精确整数,非 80000 结尾的近似值
if _, ok := bigInt.SetString(decStr, 10); !ok {
panic("invalid decimal string")
}
resultHex = fmt.Sprintf("%016X", bigInt)[2:14]
fmt.Println("From exact decimal:", resultHex) // 同样输出:000015877CD0
}// ❌ 危险:直接写 uint64 字面量(Go 会尝试解析为 float64 再转 uint64)
var V = 10736581604118680000 // 实际被当作 float64 近似,已失真
// ❌ 更危险:先 ParseFloat 再转 uint64
f, _ := strconv.ParseFloat("10736581604118680000", 64)
v := uint64(f) // 此步发生不可逆精度截断
// ❌ 错误假设:认为 uint64 能无损容纳所有 19 位十进制数
// 实际上:10736581604118679553 和 10736581604118680000 在 uint64 中可能映射到同一值// 比较 float64 解析前后是否相等
s := "10736581604118679553"
f, _ := strconv.ParseFloat(s, 64)
back := strconv.FormatUint(uint64(f), 10)
fmt.Println("Original:", s)
fmt.Println("Rounded: ", back
) // 若不等,则已失真
// 输出:Original: 10736581604118679553
// Rounded: 10736581604118679552 ← 已偏差!精度不是玄学,而是可预测的工程约束。用对工具,就能让每颗 iButton 的身份认证坚如磐石。
# go
# go语言
# 字节
# 工具
# ai
# math
# 字符串
# int
相关文章:
南平网站制作公司,2025年南平市事业单位报名时间?
如何用景安虚拟主机手机版绑定域名建站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
贸易公司网站制作流程,出口贸易网站设计怎么做?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何高效配置IIS服务器搭建网站?
css网站制作参考文献有哪些,易聊怎么注册?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何快速生成凡客建站的专业级图册?
Android自定义控件实现温度旋转按钮效果
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
如何选择最佳自助建站系统?快速指南解析优劣
韩国服务器如何优化跨境访问实现高效连接?
常州企业建站如何选择最佳模板?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何用PHP工具快速搭建高效网站?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
PHP 500报错的快速解决方法
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
再谈Python中的字符串与字符编码(推荐)
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何在阿里云高效完成企业建站全流程?
网站制作说明怎么写,简述网页设计的流程并说明原因?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何选择高性价比服务器搭建个人网站?
香港服务器租用费用高吗?如何避免常见误区?
如何高效完成自助建站业务培训?
内网网站制作软件,内网的网站如何发布到外网?
高防服务器如何保障网站安全无虞?
定制建站方案优化指南:企业官网开发与建站费用解析
建站之星如何快速生成多端适配网站?
如何在云主机上快速搭建网站?
如何快速搭建响应式可视化网站?
Android使用GridView实现日历的简单功能
建站之星各版本价格是多少?
利用JavaScript实现拖拽改变元素大小
如何在阿里云香港服务器快速搭建网站?
建站之星伪静态规则如何设置?
建站主机SSH密钥生成步骤及常见问题解答?
宝塔新建站点为何无法访问?如何排查?
寿县云建站:智能SEO优化与多行业模板快速上线指南
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
网站企业制作流程,用什么语言做企业网站比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。