在Java中轻松交换double / float

时间:2015-12-23 09:13:35

标签: java precision

我有一个Java程序,它会抛出很多实数。

我有两种模式,我希望能够编译它。

  • 准确"模式,我想对所有实数使用双精度。
  • 快速"快速"模式,我想使用单精度。

我是否可以通过某种方式在全球范围内将所有double floatFloat换成一个标志?目前,我正在使用"查找和替换",这不是最好的做事方式。

编辑:由于有些人建议使用模板/泛型,我还会增加一个要求:效率。根据我的理解,big-F float是对值的引用,而small-f,原始import UIKit import Parse @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? //-------------------------------------- // MARK: - UIApplicationDelegate //-------------------------------------- func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { Parse.setApplicationId("APIKEYHERE", clientKey: "CLIENTKEYHERE") let types:UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound] let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() return true } //-------------------------------------- // MARK: Push Notifications //-------------------------------------- func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { let installation = PFInstallation.currentInstallation() installation.setDeviceTokenFromData(deviceToken) installation.saveInBackground() PFPush.subscribeToChannelInBackground("") { (succeeded: Bool, error: NSError?) in if succeeded { print("ParseStarterProject successfully subscribed to push notifications on the broadcast channel.\n"); } else { print("ParseStarterProject failed to subscribe to push notifications on the broadcast channel with error = %@.\n", error) } } } func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { if error.code == 3010 { print("Push notifications are not supported in the iOS Simulator.\n") } else { print("application:didFailToRegisterForRemoteNotificationsWithError: %@\n", error) } } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { PFPush.handlePush(userInfo) if application.applicationState == UIApplicationState.Inactive { PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) } } } 只是值,因此使用基元更有时间和内存效率,特别是在处理它们的大数组时(我是)。模板/泛型不能与基元一起使用。所以我想找到一个不需要牺牲效率的解决方案(因为这会破坏整个问题的最初目的)。除非我弄错了,并且有一些方法可以用模板和灵长来做这件事。

结论如此远(2015年12月28日21:00):没有令人满意的方式,只需使用双倍。

  • 使用任何包装器是不能令人满意的,因为它会导致一个指针数组,效率很低。

5 个答案:

答案 0 :(得分:3)

您要找的是strategy

创建一个接口(或可能是抽象类),它是实数的模型:

public interface RealNumber {
    // Define needed methods here!
}

然后为该接口创建至少两个实现:

public final class AccurateRealNumber implements RealNumber {
    private final double number;
    public AccurateRealNumber(double number) { this.number = number; }
    // Implement interface methods here!
}

public final class LazyRealNumber implements RealNumber {
    private final float number;
    public LazyRealNumber(float number) { this.number = number; }
    // Implement interface methods here!
}

然后,您只能使用RealNumber类型的变量,其实例可以是LazyRealNumberAccurateRealNumber - 您的选择。

您必须在接口中声明需要使用的方法,以便可以在该接口类型的变量上调用它们。这些方法应包含用于解决域逻辑的域逻辑。他们应该返回值(尽管他们可以),因为这些值的类型不同。

答案 1 :(得分:2)

使用浮点数比使用浮点数获得的速度或内存效率要高得多(单词大小现在是64位,双倍也是64位)。

答案 2 :(得分:1)

这可能是过度工程,但你如何使用依赖注入对象?

例如,您可以定义两个单独的对象,这些对象基本上只包括浮点数和双精度数。我想到的结构:

public class FastNumber implements MyNumber<Float>{
    private Float number;
    ...
}
public class AccurateNumber implements MyNumber<Double>{
    private Double number;
    ...
}
public interface MyNumber<T>{
    //Methods to access and mutate number
    addToNumber(T num);
    subtractFromNumber(T num);
}

由于他们可以实现相同的接口,因此您可以将代码更改为仅使用该接口,然后您可以根据简单的配置根据需要依赖注入FastNumberAccurateNumber。例如,使用spring boot或仅使用spring。再次,这可能是过度工程化的。

答案 3 :(得分:0)

我认为一个好的方法是创建一个类的模板,其中包含您想要动态更改的类型的变量。然后,您可以根据您想要使用的模式传入您喜欢的任何类型。

答案 4 :(得分:0)

可能就像这个

一样简单
constant: 
    integer-constant
    floating-constant 
    enumeration-constant 
    character-constant 

}

为简单起见,类成员都是公共的,数组的大小是固定的,但我希望你能理解。