Shiny R中DT表格浮点数多余小数位问题求助
解决Shiny DT组件浮点数精度显示问题
问题原因
控制台显示的单小数位浮点数是R自动做了格式化展示,但实际数据存储的是二进制浮点数(比如430.3无法被二进制精确表示,实际存储为近似值430.2999878),DT组件默认读取原始存储值,导致显示多余小数位。
解决方案
以下两种方法都能解决这个问题:
方法1:使用DT的formatRound函数直接格式化列
在renderDT中添加formatRound,指定需要格式化的列和小数位数:
output$dtable <- renderDT( { selected_data <- if (input$ports == 'Port 1') { bvk_idirect } else if (input$ports == 'Port 2') { bvksk_idirect } else { bvk_idirect } selected_data }, # 添加格式化规则 options = list(pageLength = 10), # 指定列的小数位数,列名或列索引都可以 formatRound(c('Market.Value', 'Yesterdays.Price'), digits = 1) )
方法2:先预处理数据框的数值列
如果需要在数据层面固定小数位数,可以先对目标列做四舍五入处理,再传给DT:
output$dtable <- renderDT( { selected_data <- if (input$ports == 'Port 1') { bvk_idirect %>% mutate( Market.Value = round(Market.Value, 1), Yesterdays.Price = round(Yesterdays.Price, 1) ) } else if (input$ports == 'Port 2') { bvksk_idirect %>% mutate( Market.Value = round(Market.Value, 1), Yesterdays.Price = round(Yesterdays.Price, 1) ) } else { bvk_idirect %>% mutate( Market.Value = round(Market.Value, 1), Yesterdays.Price = round(Yesterdays.Price, 1) ) } selected_data } )
如果你的数据是data.table格式,也可以用data.table语法处理:
# 以bvk_idirect为例 bvk_idirect[, c('Market.Value', 'Yesterdays.Price') := lapply(.SD, round, 1), .SDcols = c('Market.Value', 'Yesterdays.Price')]
说明
你之前尝试的formattedRounding并非DT包的标准函数,正确用于列格式化的是formatRound(针对数值)、formatCurrency(针对货币)等函数,这些函数可以直接在renderDT中调用,精准控制列的显示格式。
内容的提问来源于stack exchange,提问作者Balepur
相关产品推荐
相关产品推荐

