gpt4 book ai didi

java - Java (Android) 中从 float 到 char[] 的转换

转载 作者:行者123 更新时间:2023-12-02 03:22:30 25 4
gpt4 key购买 nike

我有一个应用程序,在 View 的 onDraw() 方法中,我需要在屏幕上绘制几个 float 。为了避免垃圾收集,我试图摆脱此方法中的所有分配。问题是我想在屏幕上绘制具有指定小数位数的 float ,但我找不到任何信息如何在不使用 String.format() 且不使用字符串的情况下执行此操作。如果没有字符串和内存分配,即使是从 float 到 char[] 的简单转换似乎也是一个问题。

那么问题是如何解决这个问题?

附注在 onDraw() 方法之前无法提前转换它们,因为数字可以在用户触摸事件(例如滚动)期间更改。

最佳答案

实现您自己的格式化程序。以下是简化格式化程序的示例。

它从末尾填充缓冲区并返回起始索引。如果 float 对于缓冲区来说太大,它将失败并抛出 ArrayIndexOutOfBoundsException,并且它无法处理负值、无穷大和 NaN。我将把这个问题留给你。

如果您需要从头开始填充缓冲区,只需使用System.arraycopy()来移动字符。

如您所见,唯一的分配是 char 缓冲区。

public static int format(char[] buffer, float value, int decimals) {
float v = value;
for (int i = 0; i < decimals; i++)
v *= 10f;
int num = Math.round(v);
int idx = buffer.length;
for (int i = 0; i < decimals; i++, num /= 10)
buffer[--idx] = (char) ('0' + num % 10);
if (decimals > 0)
buffer[--idx] = '.';
do {
buffer[--idx] = (char) ('0' + num % 10);
} while ((num /= 10) != 0);
return idx;
}

测试

char[] buffer = new char[10];
int startIdx = format(buffer, (float)Math.PI, 4);
for (int i = startIdx; i < buffer.length; i++)
System.out.print(buffer[i]);
System.out.println();

输出

3.1416

关于java - Java (Android) 中从 float 到 char[] 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com