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
相关文章:
寿县云建站:智能SEO优化与多行业模板快速上线指南
为什么Go需要go mod文件_Go go mod文件作用说明
如何用景安虚拟主机手机版绑定域名建站?
建站主机默认首页配置指南:核心功能与访问路径优化
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
已有域名和空间如何快速搭建网站?
如何基于PHP生成高效IDC网络公司建站源码?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何获取PHP WAP自助建站系统源码?
ppt制作免费网站有哪些,ppt模板免费下载网站?
建站之星客服服务时间及联系方式如何?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
如何设置并定期更换建站之星安全管理员密码?
股票网站制作软件,网上股票怎么开户?
香港网站服务器数量如何影响SEO优化效果?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站之星如何快速生成多端适配网站?
自助网站制作软件,个人如何自助建网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
javascript中的try catch异常捕获机制用法分析
盐城做公司网站,江苏电子版退休证办理流程?
如何通过cPanel快速搭建网站?
如何用花生壳三步快速搭建专属网站?
智能起名网站制作软件有哪些,制作logo的软件?
Python lxml的etree和ElementTree有什么区别
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站主机数据库如何配置才能提升网站性能?
如何配置WinSCP新建站点的密钥验证步骤?
学校为何禁止电信移动建设网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
宝塔新建站点为何无法访问?如何排查?
如何通过西部建站助手安装IIS服务器?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
焦点电影公司作品,电影焦点结局是什么?
如何在阿里云域名上完成建站全流程?
如何构建满足综合性能需求的优质建站方案?
建站为何优先选择香港服务器?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
香港服务器部署网站为何提示未备案?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何快速搭建高效服务器建站系统?
定制建站如何定义?其核心优势是什么?
如何在腾讯云服务器上快速搭建个人网站?
成都网站制作报价公司,成都工业用气开户费用?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
python的本地网站制作,如何创建本地站点?
*请认真填写需求信息,我们会在24小时内与您取得联系。