[ https://issues.apache.org/jira/browse/IO-876?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18014016#comment-18014016 ]
Gary D. Gregory edited comment on IO-876 at 8/14/25 11:00 PM: -------------------------------------------------------------- Yeah, the Javadoc and behavior match at least: "round down". I added more tests to check the current behavior in {{org.apache.commons.io.FileUtilsTest.testByteCountToDisplaySizeLong():}} {code:java} // Constants and round down. assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB + 1)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI.add(BigInteger.ONE))); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB + 1)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI.add(BigInteger.ONE))); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB + 1)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI.add(BigInteger.ONE))); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB + 1)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI.add(BigInteger.ONE))); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB + 1)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI.add(BigInteger.ONE))); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB + 1)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI.add(BigInteger.ONE))); // Constants and round down. assertEquals("1023 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB - 1)); assertEquals("1023 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI.subtract(BigInteger.ONE))); assertEquals("1023 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB - 1)); assertEquals("1023 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI.subtract(BigInteger.ONE))); assertEquals("1023 bytes", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB - 1)); assertEquals("1023 bytes", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI.subtract(BigInteger.ONE))); assertEquals("1023 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB - 1)); assertEquals("1023 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI.subtract(BigInteger.ONE))); assertEquals("1023 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB - 1)); assertEquals("1023 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI.subtract(BigInteger.ONE))); assertEquals("1023 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB - 1)); assertEquals("1023 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI.subtract(BigInteger.ONE))); {code} was (Author: garydgregory): Yeah, the Javadoc and behavior match at least: "round down". I added more tests to check the current behavior in {{org.apache.commons.io.FileUtilsTest.testByteCountToDisplaySizeLong():}} {code:java} // Constants and round down. assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB + 1)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI)); assertEquals("1 EB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI.add(BigInteger.ONE))); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB + 1)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI)); assertEquals("1 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI.add(BigInteger.ONE))); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB + 1)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI)); assertEquals("1 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI.add(BigInteger.ONE))); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB + 1)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI)); assertEquals("1 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI.add(BigInteger.ONE))); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB + 1)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI)); assertEquals("1 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI.add(BigInteger.ONE))); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB + 1)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI)); assertEquals("1 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI.add(BigInteger.ONE))); // Constants and round down. assertEquals("1023 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB - 1)); assertEquals("1023 PB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_EB_BI.subtract(BigInteger.ONE))); assertEquals("1023 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB - 1)); assertEquals("1023 MB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_GB_BI.subtract(BigInteger.ONE))); assertEquals("1023 bytes", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB - 1)); assertEquals("1023 bytes", FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB_BI.subtract(BigInteger.ONE))); assertEquals("1023 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB - 1)); assertEquals("1023 KB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_MB_BI.subtract(BigInteger.ONE))); assertEquals("1023 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB - 1)); assertEquals("1023 TB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_PB_BI.subtract(BigInteger.ONE))); assertEquals("1023 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB - 1)); assertEquals("1023 GB", FileUtils.byteCountToDisplaySize(FileUtils.ONE_TB_BI.subtract(BigInteger.ONE)));\ {code} > FileUtils.byteCountToDisplaySize returns incorrect values > --------------------------------------------------------- > > Key: IO-876 > URL: https://issues.apache.org/jira/browse/IO-876 > Project: Commons IO > Issue Type: Bug > Affects Versions: 2.8.0, 2.20.0 > Reporter: Samael Bate > Priority: Major > > I get that there can be discrepancies depending on whether discussing GB or > GiB but as commons-io has a constant for {{FileUtils.ONE_GB}} which is > 1,073,741,824 I can presume that the value being returned by > FileUtils.byteCountToDisplaySize should actually be an accurate GiB value, > despite the text being just GB. > So there's two problems here, the text saying MG, GB, etc should probably be > formatted with the more correct text post-fixed (MiB, GiB, etc). > However my main issue is that either way the results are just wrong. This > seems to be caused by the function simply dropping the fractional digits > rather than using any decimal places or rounding. > For example 1.9 GB will get returned by this function as "1 GB": > {code:java} > FileUtils.byteCountToDisplaySize(2018148352L) // returns "1 GB" but is only > just a little short of 2 GB{code} > > Seems this has been an issue for a while: > * https://issues.apache.org/jira/browse/IO-226 (created 2010) > * https://issues.apache.org/jira/browse/IO-294 (created 2011) > * https://issues.apache.org/jira/browse/IO-373 (created 2013) > -- This message was sent by Atlassian Jira (v8.20.10#820010)