You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:47:14