NSIS如何将磁盘大小四舍五入到1或2位小数?
解决NSIS中系统驱动器容量的小数格式化问题
你的原始代码通过整数除法将字节转成GB,但只能得到整数结果,intop无法处理浮点数运算,返回0是正常的——它只支持32位整数的截断运算。Math::Script插件完全可以实现你要的四舍五入到1或2位小数的需求,以下是具体实现方案:
方法1:使用Math::Script插件(简洁推荐)
该插件支持浮点数运算和四舍五入函数,能直接完成转换和格式化:
!include logiclib.nsh !include "Math.nsh" ; 确保Math插件已包含在NSIS环境中 Section ; 获取系统驱动器总容量(第三个参数为总容量,若要可用空间则用第一个参数*l.r0) System::Call 'kernel32::GetDiskFreeSpaceEx(t"$windir", *l, *l.r0, *l)' ; 将字节数转换为GB(1GB = 1024^3 字节),得到浮点数 Math::Script '$0 / (1024^3)' Pop $1 ; 四舍五入到2位小数,若要1位则改为Round($1, 1) Math::Script 'Round($1, 2)' Pop $1 DetailPrint "系统驱动器总容量:$1 GB" SectionEnd
方法2:手动整数运算实现(无需插件)
如果不想依赖插件,可以通过64位整数运算手动处理四舍五入:
!include logiclib.nsh Section System::Call 'kernel32::GetDiskFreeSpaceEx(t"$windir", *l, *l.r0, *l)' ; 计算总字节数 * 100 + 半GB(用于四舍五入),再除以1GB的字节数 ; 1GB = 1073741824 字节,半GB = 536870912 System::Int64Op $0 * 100 + 536870912 Pop $0 System::Int64Op $0 / 1073741824 Pop $1 ; 拆分整数和小数部分 IntOp $2 $1 / 100 IntOp $3 $1 % 100 ; 格式化输出(若要1位小数,将100改为10,对应调整拆分逻辑) DetailPrint "系统驱动器总容量:$2.$3 GB" SectionEnd
关键说明
- 原始代码中
GetDiskFreeSpaceEx的第二个参数是可用空间,第三个参数才是驱动器总容量,按需调整即可。 Math::Script的Round函数直接支持指定小数位数,比手动处理更不易出错。
内容的提问来源于stack exchange,提问作者Jairo
相关产品推荐
相关产品推荐

