BigDecimal去零转字符串:避开科学计数法与JDK陷阱
1. 先从需求说起一个看起来简单的小问题做过几年Java后端的朋友大概率都遇到过这样一个需求数据库里存的金额是DECIMAL(20,6)或者种精度比较高的数值查询出来是BigDecimal类型前端的表格、对账单、导出Excel又希望看到去零版本——比如5.100000显示成5.13.000000显示成3而不是把一堆没意义的0带出去。更难受的是如果你直接调BigDecimal.toString()一旦数值超过一定范围它还给你冒出科学计数法比如1E7前端直接懵了。这个需求说白了就是四个字去零转串。但真到写代码的时候会发现里面藏了不少坑尤其是scale、精度、科学计数法这几个点搅在一起的时候稍不注意就会处理出一堆脏数据。这篇文章把我实际踩过的坑和最终稳定的处理方案完整整理出来新手可以直接抄作业老手也可以对比一下自己的写法看看有没有遗漏边界情况。先说结论核心靠stripTrailingZeros()去尾零配合toPlainString()避免科学计数法但要注意Java 8及以下JDK对BigDecimal.ZERO的一个历史遗留坑。听起来很简单实际上一堆人在这儿翻车。2. 为什么不能直接转字符串三个坑必须提前知道2.1 坑一toString()会输出科学计数法先看一段最直观的代码BigDecimal num new BigDecimal(1.00E7); System.out.println(num.toString()); System.out.println(num.toPlainString());输出结果是什么第一行是1.0E7第二行才是10000000。问题根源在于BigDecimal.toString()的设计当数值的scale为负值、或者去掉尾零后的精度膨胀到一定程度时Java会主动采用科学计数法表示。这在调试的时候问题不大但一旦进了报表、文件、签名逻辑就全乱了。比如你在做对账文件的时候1.0E7和10000000显然是两个不同的字符串下游解析不对直接对账失败。所以只要你是给人看的或者给对账系统消费的字符串几乎可以无脑用toPlainString()。这个函数的名字起得很直白就是输出成普通字符串不带指数。2.2 坑二toString()会保留末尾无效的0BigDecimal num new BigDecimal(5.100000); System.out.println(num.toString()); // 5.100000如果不做任何处理5.100000转出来就是5.100000不会自动去掉后面的0。很多人以为BigDecimal是数值类型转字符串应该自动优化但Java没有做这一步因为一旦去掉尾0scale就变了而scale在某些业务场景比如精确计算的小数位数控制里是有语义的。这正好带出我们要做的核心操作主动调用stripTrailingZeros()告诉JVM尾部的0我不要了请把小数位收缩掉。2.3 坑三new BigDecimal(double)会引入浮点脏数据这也是个经典问题稍微放后面一点重点说。在这里先记住一条铁律从double构造BigDecimal永远用BigDecimal.valueOf(double)不要用new BigDecimal(double)。比如new BigDecimal(0.1)打印出来是一长串0.1000000000000000055511151231257827021181583404541015625因为我们是先把0.1这个二进制浮点数完整地如实翻译成了十进制。虽然stripTrailingZeros()能救回一部分但很多场景下你连这串脏数据都不想看到。3. 核心方法解密stripTrailingZeros()和toPlainString()的配合3.1stripTrailingZeros()到底做了什么底层操作先看一个简单例子BigDecimal num new BigDecimal(5.100000); System.out.println(num.scale()); // 6 BigDecimal stripped num.stripTrailingZeros(); System.out.println(stripped.scale()); // 1 System.out.println(stripped); // 5.1stripTrailingZeros()的原理并不玄学它会把内部存储的未缩放值unscaled value和scale重新规整把所有末尾的0从scale里扣除。比如5.100000的未缩放值是5100000scale6去掉末尾四个0之后未缩放值变成51scale1数值上完全相等但小数位数变了。这一步不仅影响字符串展示也影响后续计算。举个例子5.10除以2如果原始scale2结果scale会保留一定精度显示2.55如果先stripTrailingZeros()变成5.1再除以2可能得到2.55或2.550——取决于除法的MathContext设置。所以在做计算链的时候建议在最终转字符串之前再strip不要在中间步骤乱去零否则会损失原本想保留的精度语义。3.2 两种转字符串方法对同一个数的差异对比这里用一个表格对比toString()和toPlainString()在不同数值下的表现原始值toString()toPlainString()new BigDecimal(100)100100new BigDecimal(1E2)1E2100new BigDecimal(5.100000)5.1000005.100000new BigDecimal(0.000001)1E-60.000001new BigDecimal(1.2300E5)1.2300E5123000从表里可以看到toPlainString()在处理指数形式时是妥妥的人话模式。但注意toPlainString()一样会保留末尾0比如5.100000转出来还是5.100000它只负责消除指数记号不负责去零。所以结论很明确先stripTrailingZeros()去零再toPlainString()去指数两步缺一不可。顺序上我倾向于先strip再toPlainString因为strip之后scale已经缩小指数出现概率也大大降低但为了保险toPlainString依然不能省。4. 实操封装一个可直接复用的工具方法4.1 最简实现与逐步讲解先给一个最核心的版本public static String formatPlainString(BigDecimal num) { if (num null) { return null; } return num.stripTrailingZeros().toPlainString(); }这段代码对绝大多数场景已经够用。调用示例System.out.println(formatPlainString(new BigDecimal(5.100000))); // 5.1 System.out.println(formatPlainString(new BigDecimal(100.00))); // 100 System.out.println(formatPlainString(new BigDecimal(0.0000))); // 0 System.out.println(formatPlainString(new BigDecimal(1E3))); // 1000但如果你直接拿这个版本上线在Java 8及以下的JDK里第3条0.0000会翻车输出变成0E-8这种鬼东西。具体原因见第5章这个坑当年坑了我整整一个发布夜。4.2 健壮版兼容不同JDK版本与空值为了兼容老JDK我们对零值做一个单独判断。先测试BigDecimal.ZERO.stripTrailingZeros()在不同版本的表现Java 8输出0E-8或0E-8根据scale不同有变化Java 11及以上输出0实际测试是0所以健壮版的工具方法可以这么写public static String formatPlainString(BigDecimal num) { if (num null) { return ; } if (num.compareTo(BigDecimal.ZERO) 0) { return 0; } return num.stripTrailingZeros().toPlainString(); }这里用compareTo(BigDecimal.ZERO) 0而不是equals(BigDecimal.ZERO)也是个小知识点equals会比较scale0.00和0用equals比较返回false但compareTo只比数值大小返回0表示数值相等。在这种只要数值是0就返回0的场景里compareTo才是正确姿势。再给一个带小数位数兜底的版本适合不想彻底丢掉精度的场景public static String formatNum(BigDecimal num, int maxScale) { if (num null) { return ; } if (num.compareTo(BigDecimal.ZERO) 0) { return 0; } BigDecimal stripped num.stripTrailingZeros(); if (stripped.scale() maxScale) { stripped stripped.setScale(maxScale, RoundingMode.HALF_UP); } return stripped.toPlainString(); }日常业务里我一般把maxScale定义成6也就是说最大保留6位小数但只要后面全是0就会被strip掉。比如3.100000输出3.13.123456输出3.1234563.1234567输出3.123457。这种格式非常适合接口返回值。4.3 从字符串和double来源构造时的最佳实践再来一个很常见的误用场景。你的数据可能不是直接来自数据库而是算出来的double。这时候你写new BigDecimal(result)基本等于给自己埋雷。比如double d 0.1; BigDecimal bad new BigDecimal(d); System.out.println(bad); // 0.1000000000000000055511151231257827021181583404541015625正确写法是BigDecimal good BigDecimal.valueOf(d); System.out.println(good); // 0.1BigDecimal.valueOf(double)内部会先调用Double.toString(double)拿到十进制表示后再转成BigDecimal相当于先把双精度浮点数转成人能看懂的字符串再精确解析。这个方法对绝大多数业务场景是够用的。如果你的计算逻辑里对精度有极端要求请用String或者long来传递数值压根别碰double那是另一个话题这里不展开。5. Java 8的隐藏bug0去零成0E-8的真相与对策5.1 现象复现与原因分析直接跑一下这段代码BigDecimal zero new BigDecimal(0.00000000); System.out.println(zero.stripTrailingZeros().toPlainString());在JDK 8上输出的不是0而是0E-8。到了JDK 11就正常输出0了。为什么网上有解释说是JDK-6480539这个老bug的修复stripTrailingZeros在处理scale为正数、数值为0的BigDecimal时原来的逻辑没有正确把scale归零导致零值被表示成0E-8这种指数形式。JDK 9之后修复了这个问题。所以如果你还在用Java 8很多老项目确实还在用就必须自己兜底。我当年就是线上对账文件突然冒出来一个0E-8下游的解析系统直接告警。查了半天才定位到是这条路径。从此之后但凡涉及去零我这边一律先判断compareTo是不是0直接短路返回0。5.2 安全判断零值的正确写法这里强调一下判断方式// 错误的写法 if (num.equals(BigDecimal.ZERO)) { ... } // 正确的写法 if (num.compareTo(BigDecimal.ZERO) 0) { ... }equals会对值和scale做双重校验new BigDecimal(0.00).equals(BigDecimal.ZERO)返回false但这显然不是我们想要的语义。除非你明确想区分整数0和保留两位的0否则一律用compareTo。这个坑不只是去零场景会遇到做金额比较的时候也经常有人踩。6. 常见问题与排错技巧实测中的那些坑6.1 为什么我stripTrailingZeros()之后还是科学计数法场景有人写了num.stripTrailingZeros().toString()发现10000变成了1E4跑来问我是不是stripTrailingZeros()没用。真不是。问题出在toString()上。stripTrailingZeros()把数值规整后scale可能变成负数。比如BigDecimal(10000).stripTrailingZeros()内部存储会变成1E4即未缩放值1scale为-4此时toString()输出1E4属于正常行为。而你用toPlainString()它能正确输出10000。所以一句话总结去零交给stripTrailingZeros去指数交给toPlainString两个必须搭配使用缺一个都可能踩坑。6.2 为什么有时候去零后精度反而多出来了有人遇到过这种情况new BigDecimal(1.2300).stripTrailingZeros()输出1.23这没问题但是new BigDecimal(1.2300000000000000001).stripTrailingZeros()输出1.2300000000000000001觉得很奇怪为什么明明后面有0没去掉请你仔细看最后一位是1不是0。stripTrailingZeros只去掉尾部的0去掉000000000000000000之后剩下的1是有效数字当然保留。这个不算坑是很多人对去无效0的语义理解偏差。无效0的定义是从最后一个非0数字往后的所有0不是任意位置的0。6.3 负数场景与格式化场景负数的处理和正数完全一样比如-5.100000去零后输出-5.1。工具方法不需要特殊分支。但如果你要做千分位格式化比如输出1,000,000而不是1000000那DecimalFormat是更好的选择。注意这跟本文的去零需求是两码事不要混在一起做。我见过同事把DecimalFormat和stripTrailingZeros混用结果格式错乱到怀疑人生。建议去零是数据层处理千分位是展示层处理分两层各干各的别揉在一坨。6.4 金额单位换算后的去零还有一种常见业务把分转成元。数据库存的是1234567分你divide之后转成BigDecimal比如1234567 / 100得到12345.67然后转字符串。这时候小数位一般已经干净了但有些恰好整除的比如1000000 / 100 10000.00就又会带着两个0出来。老规矩stripTrailingZeros().toPlainString()一跑输出10000干净利落。但要注意一旦涉及divide最好显式指定scale和RoundingMode不然BigDecimal.divide在某些整除场景会抛ArithmeticException: Non-terminating decimal expansion这也是另一道高频坑。示例BigDecimal cents new BigDecimal(1000000); BigDecimal yuan cents.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); String result stripZero(yuan); // 100006.5 我最终稳定的工具类结合以上经验贴一份我目前还在用的完整工具类基本覆盖了99%的业务场景public class BigDecimalFormatUtils { private static final int DEFAULT_MAX_SCALE 6; private BigDecimalFormatUtils() { } /** * 去尾零后转普通字符串兼容JDK8及以下版本的0值bug */ public static String toPlainNoZero(BigDecimal num) { if (num null) { return ; } if (num.compareTo(BigDecimal.ZERO) 0) { return 0; } return num.stripTrailingZeros().toPlainString(); } /** * 最多保留maxScale位小数去掉末尾无效0 */ public static String toPlainWithMaxScale(BigDecimal num, int maxScale) { if (num null) { return ; } if (num.compareTo(BigDecimal.ZERO) 0) { return 0; } BigDecimal result num.stripTrailingZeros(); if (result.scale() maxScale) { result result.setScale(maxScale, RoundingMode.HALF_UP); } return result.toPlainString(); } }调用侧就不用操心了直接String s1 BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(1E8)); String s2 BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(3.140000)); String s3 BigDecimalFormatUtils.toPlainNoZero(BigDecimal.ZERO);三种输出分别是100000000、3.14、0全部符合预期。7. 除了转字符串去零这个操作还影响什么7.1 对scale的连锁影响很多人在接口返回某个数值的时候只管看起来对不对不关心scale。但你要知道stripTrailingZeros()之后的scale可能变成负数。比如new BigDecimal(1E3)它的scale是-3。如果你把这个BigDecimal直接塞给有些ORM框架、或者参与后续除法运算负数scale会带来一些意外行为。举个实际场景A接口查到金额100假设数据库精度是DECIMAL(10,2)取出时scale2即100.00。你去零后变成了BigDecimal(1E2)scale-2。如果此时再把这个值塞进另一个SQL查询条件有些JDBC驱动会把scale也带到数据库端最终执行的SQL参数类型解析可能不一样。为了避免这种阴间问题我一般在去零转字符串的同时也会额外做一次setScale(2)或者干脆用字符串输出再去解析原则是展示归展示计算归计算。7.2 对equals和hashCode的影响去零会改变scale而BigDecimal.equals()会把scale纳入相等性判断。于是可能出现这种情况new BigDecimal(5.10).equals(new BigDecimal(5.1))返回false。如果你把去零后的BigDecimal放进HashMap或者HashSet同一个数值看起来相同却可能被当成两个key。这种问题排查起来很头疼因为它不会报错只会悄悄让数据重复或匹配失败。所以再强调一次如果只是转字符串展示可以在最后一步去零如果这个BigDecimal还要参与计算、比较、集合操作先想清楚你要不要保留scale语义。7.3 JSON序列化场景下的表现在Spring Boot Jackson的默认配置下BigDecimal序列化成JSON时走的是toString()逻辑。这意味着1E3这个BigDecimal序列化后就是1E3前端JSON.parse后会得到一个普通数字但如果你们的接口文档要求返回字符串那和预期就不一致了。更稳妥的做法是在DTO里直接用一个字符串字段塞进去零后的toPlainString()结果而不是把原始BigDecimal直接暴露出去。我自己做接口对接的时候凡是下游要求金额不带多余零的我都在VO层面转换成String再返回绝不让BigDecimal裸奔到JSON层。一方面是显示格式可控另一方面也能避免JavaScript对大数精度丢失的问题——JSON里的大数被JSON.parse之后转成Number容易丢精度转成String才是最安全的。8. 从这类小问题延伸出的几点心得BigDecimal去零转字符串这件事本身很小但它牵扯出来的问题特别多科学计数法、scale语义、浮点构造、JDK版本差异、序列化行为。我见过不少资历不浅的开发在这个地方翻车翻得毫无防备不是因为代码难写而是因为Java对BigDecimal的内部表示和数学上的数值不是一回事。我个人在实际项目里养成了这么几个习惯第一接手一个老项目先扫一遍全项目里对BigDecimal直接调用toString()的地方凡是面向页面、接口、对账文件的都能改成stripTrailingZeros().toPlainString()。这一步基本零成本却能消掉一大类线上显示问题。第二统一封装工具类禁止业务代码里散养格式逻辑。一个项目里只允许出现一个BigDecimalFormatUtils所有去零转串统一走它后面要加规则、修bug都只动一个文件。第三写单元测试时把边界值列全0、0.00、负数、科学计数法、超大数、极小小数、null。别嫌麻烦这里每一个边界都能暴露出不同的问题。我列一个简单的测试用例模板Test void testToPlainNoZero() { assertEquals(5.1, BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(5.100000))); assertEquals(0, BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(0.0000))); assertEquals(-5.1, BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(-5.100000))); assertEquals(100000000, BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(1E8))); assertEquals(0.000001, BigDecimalFormatUtils.toPlainNoZero(new BigDecimal(0.000001))); assertEquals(, BigDecimalFormatUtils.toPlainNoZero(null)); }这些断言看着简单但如果你在Java 8上跑0.0000那条是能抓住0E-8这个bug的所以测试用例永远别嫌多。最后再分享一个小技巧当你怀疑为什么这段代码在本地好好的到了线上就不一样了第一步不是查业务逻辑而是确认两边的JDK版本。BigDecimal在JDK 8和JDK 11之间的行为差异就是一个让人浪费过一整天的真实案例。把JDK版本纳入排查范围很多灵异现象瞬间不再灵异。

相关新闻

OpenPencil 画布导航完全指南:平移、缩放与命令面板

OpenPencil 画布导航完全指南:平移、缩放与命令面板

前端桌面应用AI 应用MCP 服务 【免费下载链接】open-pencil AI-native design editor. Open-source Figma alternative. 项目地址: https://gitcode.com/gh_mirrors/op/open-pencil 点击查看 免费下载 OpenPencil 的编辑画布没有边界——文档内容可以无限延伸&…

2026/10/10 21:29:15 阅读更多 →
Tinycast vs Raycast 横评:兼容 114/147 个命令之外,差距还剩什么?

Tinycast vs Raycast 横评:兼容 114/147 个命令之外,差距还剩什么?

Tinycast vs Raycast 横评:兼容 114/147 个命令之外,差距还剩什么? 【免费下载链接】tinycast Tinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history. 项目地址: https://gitcode.com/GitHub_Trending/ti/tin…

2026/10/10 21:29:15 阅读更多 →
PyBind11实战:用C++为Python打造高性能扩展模块

PyBind11实战:用C++为Python打造高性能扩展模块

1. 先想清楚:为什么是PyBind11,而不是Cython或ctypesPython写业务逻辑确实舒服,但一旦碰上重计算、图像处理、硬件通信这类场景,性能瓶颈很快就会暴露出来。我之前接手过一个视频处理脚本,纯Python实现逐帧调用OpenCV做…

2026/10/10 21:29:15 阅读更多 →

最新新闻

IP5385P单芯片45W快充充电宝方案设计与量产实践

IP5385P单芯片45W快充充电宝方案设计与量产实践

接了一个45W大功率充电宝项目,工期紧,老板压得厉害。最初我们看了一圈方案,有的需要外置协议IC,有的要自己写复杂的MCU快充协商逻辑,有的整体BOM成本根本压不下来。最后翻到英集芯选型表,看到IP5385P这颗芯…

2026/10/10 22:17:05 阅读更多 →
Python 一键灌卡:把真题词表批量变成 Anki 牌组

Python 一键灌卡:把真题词表批量变成 Anki 牌组

Python 一键灌卡:把真题词表批量变成 Anki 牌组 【免费下载链接】anki Anki is a smart spaced repetition flashcard program 项目地址: https://gitcode.com/GitHub_Trending/an/anki 背单词圈的共识越来越一致:Anki 不是"背单词软件"…

2026/10/10 22:17:05 阅读更多 →
从Copilot到Co-Engineer:L3 AI Coding如何重构软件研发的底层逻辑——TaoToken统一Key接入实战

从Copilot到Co-Engineer:L3 AI Coding如何重构软件研发的底层逻辑——TaoToken统一Key接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 22:17:05 阅读更多 →
revit-mcp 服务配置答疑:uvx 启动失败与 MCP 连接排查,把 endpoint 改到 TaoToken

revit-mcp 服务配置答疑:uvx 启动失败与 MCP 连接排查,把 endpoint 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 22:17:05 阅读更多 →
Claude BugHunter 技能分析报告:把 Burp MCP 接到 TaoToken 的配置与验证

Claude BugHunter 技能分析报告:把 Burp MCP 接到 TaoToken 的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 22:17:04 阅读更多 →
GA-HIDMSPSO优化LSTM超参数:时间序列分类实战

GA-HIDMSPSO优化LSTM超参数:时间序列分类实战

1. 从"调参调到怀疑人生"说起:为什么要把遗传算法塞进粒子群做时间序列分类预测的人,大概都有过这种体验:LSTM网络结构搭好了,数据也清洗干净了,结果一跑起来,准确率死活上不去。回头一查&#x…

2026/10/10 22:16:04 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →