Java重写round()方法

本文介绍了一个自定义的Java方法实现四舍五入功能,避免使用JDK中的现有方法,通过解析输入字符串并计算指定小数位数后的四舍五入结果。

题目:完成这个方法的代码实现 public static String round (String arg1, int arg2)

参数 arg1:表示等待被处理的数据:如:"100.286"

参数 arg2:处理后保留的个数位数:如:2

返回值:对arg1保留arg2位小数位数并且四舍五入后的结果值。如:“100.29”

要求不能使用JDK中的数值类Class的现有四舍五入方法。

实现:

public static String round(String arg1, int arg2) {
        try{
            double arg1Value = Double.parseDouble(arg1);
        }catch (Exception e) {
           return null;
        }

        if(arg2 <= 0){
            return null;
        }

        if(arg1.indexOf(".")<0){
            return arg1;
        }
        
        int pointPos = arg1.indexOf(".")+1;
        if(pointPos+arg2+1>arg1.length()){
            return arg1;
        }

        int value1 = Integer.parseInt(arg1.substring(pointPos+arg2, pointPos+arg2+1));
        System.out.println(value1);
        if(value1<5){
            return arg1.substring(0, pointPos+arg2);
        }else{
            double value2 = Double.parseDouble(arg1.substring(0, pointPos+arg2));
            if(value2<0){
                value2=value2-Math.pow(0.1, arg2);
            }else {
                value2=value2+Math.pow(0.1, arg2);
            }
            
            return String.valueOf(value2);
        }
    }

对于题目中给出的例子进行测试

System.out.println(round("100.286", 2));  

运行结果:100.29

对于负数进行测试

System.out.println(round("-100.286", 2));  

运行结果:-100.29

对于非数值字符串进行测试

System.out.println(round("a10b0.286", 2));  

运行结果:null

总结

该方法是对java中Math类下的round方法的重写,可能有不完备的地方或者有错误的地方,希望各位大牛能不吝赐教,望大牛能给出好的建议,先谢啦。

<think>我们正在讨论的是使用Java语言实现gRPC客户端的Channel缓存池,以及可能的替代方案(如服务发现)。需要重写之前Python示例中的缓存池逻辑为Java版本,并补充Java特有的注意事项。 注意:在Java中,gRPC的Channel是通过ManagedChannelBuilder构建的,并且需要管理ManagedChannel对象。 核心要点: 1. 创建一个Channel缓存池,根据目标地址(ip:port)缓存ManagedChannel实例。 2. 需要线程安全,因为多个线程可能同时请求同一个Channel。 3. 提供关闭所有Channel的方法。 4. 考虑连接复用和资源管理(例如,空闲连接超时关闭)。 此外,我们还可以提到使用服务发现的方式(如通过NameResolver和LoadBalancer)。 由于用户要求用Java重写,我们将提供Java代码示例。 </think>是的,使用 Java 实现 gRPC 客户端时,采用 **Channel 缓存池**是管理多目标连接的推荐方案。以下是 Java 实现的关键代码和设计说明: ### Java 版 Channel 缓存池实现 ```java import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; public class GrpcChannelPool { private final ConcurrentHashMap<String, ManagedChannel> channelMap = new ConcurrentHashMap<>(); private final ReentrantLock lock = new ReentrantLock(); // 获取或创建 Channel public ManagedChannel getChannel(String ip, int port) { String key = ip + ":" + port; // 双重检查锁定确保线程安全 if (!channelMap.containsKey(key)) { lock.lock(); try { if (!channelMap.containsKey(key)) { ManagedChannel channel = ManagedChannelBuilder.forAddress(ip, port) .usePlaintext() // 禁用 TLS (生产环境应启用) .enableRetry() // 启用重试 .keepAliveTime(10, TimeUnit.SECONDS) // 保活间隔 .build(); channelMap.put(key, channel); } } finally { lock.unlock(); } } return channelMap.get(key); } // 关闭所有 Channel(JVM 退出时调用) public void shutdown() throws InterruptedException { for (ManagedChannel channel : channelMap.values()) { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } } } ``` ### 使用示例 ```java // 初始化缓存池 GrpcChannelPool pool = new GrpcChannelPool(); // 向不同服务发送请求 ManagedChannel channelA = pool.getChannel("192.168.1.10", 50051); MyServiceGrpc.MyServiceBlockingStub stubA = MyServiceGrpc.newBlockingStub(channelA); Response responseA = stubA.callMethod(Request.newBuilder()...build()); ManagedChannel channelB = pool.getChannel("10.0.0.20", 60051); MyServiceGrpc.MyServiceBlockingStub stubB = MyServiceGrpc.newBlockingStub(channelB); Response responseB = stubB.callMethod(Request.newBuilder()...build()); // 程序退出时清理资源 pool.shutdown(); ``` ### Java 特有优化建议 1. **连接复用配置** ```java .maxInboundMessageSize(100 * 1024 * 1024) // 增大消息上限 .idleTimeout(30, TimeUnit.MINUTES) // 空闲超时 ``` 2. **异步请求处理** ```java // 使用异步存根提高吞吐量 MyServiceGrpc.MyServiceFutureStub asyncStub = MyServiceGrpc.newFutureStub(pool.getChannel(ip, port)); ListenableFuture<Response> future = asyncStub.callMethod(request); ``` 3. **服务发现集成** (需依赖 `grpc-services` 库) ```java ManagedChannel channel = ManagedChannelBuilder.forTarget("dns:///service.prod") .defaultLoadBalancingPolicy("round_robin") // 负载均衡策略 .build(); ``` ### 替代方案对比 | **方案** | 适用场景 | Java 实现复杂度 | |-------------------|----------------------------------|---------------| | Channel 缓存池 | 目标 IP 固定 | ★★☆ | | DNS 服务发现 | Kubernetes/云环境 | ★★★ | | 自定义 NameResolver| 复杂服务发现(如 ZooKeeper) | ★★★★ |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值