[ 
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)

Reply via email to